Код С++ продолжает падать после проверки

Я написал фрагмент кода для проверки ключевого слова, он проверяет и гарантирует, что слово состоит из 5 букв и состоит из всех букв без цифр. Однако, когда я запускаю его, кажется, что код вообще перестает работать и не предлагает мне следующий вопрос, я тестировал его без этого кода, и эта часть кода является проблемой, так как он отлично работает без него .

Код:

            cout<<name1<<", please enter the keyword (5 characters): "<<endl;
            cin>>key;
            for(int i = 0; i < keylength; i++){
                if (isalpha(key[i]) == 1){
                    validnum += 1;
                }
            }
            if (validnum == keylength && key.length() == keylength){
                validated = true;
            }
            else{
                validated = false;
            }

Где вы устанавливаете длину ключа? stackoverflow.com/help/минимально-воспроизводимый-пример

Taekahn 01.04.2022 00:14

@dominickator Если пользователь введет меньше символов, чем длина ключа, код вызовет неопределенное поведение.

Vlad from Moscow 01.04.2022 00:19

@dominickator Какой тип переменной key? Если это std::string, то весь тест: bool validated = (key.size() == 5 && std::all_of(key.begin(), key.end(), ::isalpha));

PaulMcKenzie 01.04.2022 00:20

@PaulMcKenzie key — это строка.

dominickator 01.04.2022 00:22

@Taekahn Я устанавливаю длину ключа в начале своей основной функции, это константа, равная 5.

dominickator 01.04.2022 00:23

При обращении за помощью в чем-то подобном было бы полезно показать, что вы делаете потом с такими значениями, как validated, или как вы устанавливаете keylength. Например, если validated имеет значение false, программа просто завершает работу? Тогда проблема может заключаться в вашей проверке достоверности.

Ethan McTague 01.04.2022 00:28

@EthanMcTague, если подтверждено значение false, он войдет в цикл while, который предложит пользователю ввести ключевое слово, которое соответствует условиям (5 символов и все буквы), и как только эти условия будут выполнены, цикл завершится, и программа будет двигаться на.

dominickator 01.04.2022 00:34
isalpha возвращает 0 для небуквенных символов и ненулевое значение для буквенных символов. Это не обязательно возвращает 1. Правильный способ проверить это if (isalpha(key[i])).
Pete Becker 01.04.2022 01:34
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
42
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Перед циклом for вам нужно проверить, что key.length() равно keyLength. В противном случае цикл может вызывать неопределенное поведение, когда пользователь вводит строку длиной меньше keyLength.

Также функция isalpha не обязательно возвращает 1. Она может возвращать любое положительное значение.

Измените свой код примерно так:

validated = key.length() == keyLength;

if ( validated )
{
    size_t i = 0;

    while ( i < keyLength && isalpha( ( unsigned char )key[i] ) ) ++i;

    validated = i == keyLength;
}

Да, это был тот факт, что я не проверял key.length() приравнивание keylength до запуска цикла for, спасибо!

dominickator 01.04.2022 00:45

Как упоминалось в комментариях, нет необходимости в каких-либо циклах, чтобы определить, является ли ключ 5-символьным и полностью ли он алфавитным.

Использование std::all_of проверит, являются ли все символы буквенными:

#include <algorithm>
#include <string>
#include <cctype>
#include <iostream>

bool isValidData(const std::string& key)
{
   return key.size() == 5 && std::all_of(key.begin(), key.end(), ::isalpha);
}
    
int main()
{
   //Test data  
   std::string testKeys[] = {"1abcdef", "abcde", "abcdefghijkl", "a", "xyzab"};

   for (size_t i = 0; i < std::size(testKeys); ++i)
   { 
       // Output results
       std::cout << testKeys[i] << " " << (isValidData(testKeys[i])?"OK":"BAD") << "\n";
   }
}

Выход:

1abcdef BAD
abcde OK
abcdefghijkl BAD
a BAD
xyzab OK

Кроме того, если вы взглянете на свой код, неясно, какова цель кода без запуска кода. Сравните это с функцией isValidData: если вы скажете, что в ней есть, это будет звучать почти так же, как ваше описание:

«Размер ключа должен быть 5, и все символы должны быть альфа».

Другие вопросы по теме