C ++代码在验证后不断崩溃
C++ Code keeps crashing after a validation
我写了一段代码来验证一个关键字,它验证并确保这个词是 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;
}
在 for 循环之前,您需要检查 key.length()
是否等于 keyLength
。否则,当用户输入长度小于 keyLength
.
的字符串时,循环会调用未定义的行为
另外函数isalpha
不需要returns 1。它可以return任何正值。
像下面这样更改您的代码
validated = key.length() == keyLength;
if ( validated )
{
size_t i = 0;
while ( i < keyLength && isalpha( ( unsigned char )key[i] ) ) ++i;
validated = i == keyLength;
}
如评论中所述,无需任何循环来确定密钥是否为 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,并且所有字符都必须为字母”。
我写了一段代码来验证一个关键字,它验证并确保这个词是 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;
}
在 for 循环之前,您需要检查 key.length()
是否等于 keyLength
。否则,当用户输入长度小于 keyLength
.
另外函数isalpha
不需要returns 1。它可以return任何正值。
像下面这样更改您的代码
validated = key.length() == keyLength;
if ( validated )
{
size_t i = 0;
while ( i < keyLength && isalpha( ( unsigned char )key[i] ) ) ++i;
validated = i == keyLength;
}
如评论中所述,无需任何循环来确定密钥是否为 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,并且所有字符都必须为字母”。