Я написал фрагмент кода для проверки ключевого слова, он проверяет и гарантирует, что слово состоит из 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;
}
@dominickator Если пользователь введет меньше символов, чем длина ключа, код вызовет неопределенное поведение.
@dominickator Какой тип переменной key? Если это std::string, то весь тест: bool validated = (key.size() == 5 && std::all_of(key.begin(), key.end(), ::isalpha));
@PaulMcKenzie key — это строка.
@Taekahn Я устанавливаю длину ключа в начале своей основной функции, это константа, равная 5.
При обращении за помощью в чем-то подобном было бы полезно показать, что вы делаете потом с такими значениями, как validated, или как вы устанавливаете keylength. Например, если validated имеет значение false, программа просто завершает работу? Тогда проблема может заключаться в вашей проверке достоверности.
@EthanMcTague, если подтверждено значение false, он войдет в цикл while, который предложит пользователю ввести ключевое слово, которое соответствует условиям (5 символов и все буквы), и как только эти условия будут выполнены, цикл завершится, и программа будет двигаться на.
isalpha возвращает 0 для небуквенных символов и ненулевое значение для буквенных символов. Это не обязательно возвращает 1. Правильный способ проверить это if (isalpha(key[i])).





Перед циклом 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, спасибо!
Как упоминалось в комментариях, нет необходимости в каких-либо циклах, чтобы определить, является ли ключ 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, и все символы должны быть альфа».
Где вы устанавливаете длину ключа? stackoverflow.com/help/минимально-воспроизводимый-пример