C++密码验证逻辑问题:不符合规则的字符串被误判为Valid
问题分析:密码验证程序误判原因
我尝试将某些字符串判定为Invalid,但输入类似59G71341、8pjf7h14sx13或60s1v344时,程序却输出Valid,求分析误判原因。
任务描述
声明一个名为goodPasswd的布尔变量。当secretStr包含不超过5个数字且长度大于等于5时,输出"Valid",否则输出"Invalid"。
示例:若输入为80796,输出为:
Valid示例:若输入为XBdg,输出为:
Invalid
问题代码
#include <iostream> using namespace std; int main() { string secretStr; bool goodPasswd = false; cin >> secretStr; int counter = 0; for (int i = 0; i < secretStr.length(); ++i) { if ((secretStr[i] >= 0) && (secretStr[i] <= 9)) { ++counter; } } //approves string if both true if ((counter <= 5) && (secretStr.length() >= 5)) { goodPasswd = true; } else { goodPasswd = false; } if (goodPasswd) { cout << "Valid" << endl; } else { cout << "Invalid" << endl; } return 0; }
误判原因
核心问题是判断数字字符的条件错误:
- 在C++中,
char类型存储的是字符的ASCII值,数字字符'0'的ASCII值是48,'9'是57。 - 代码里用
secretStr[i] >= 0 && secretStr[i] <=9,实际是判断字符的ASCII值是否在0-9之间,而所有字母、数字字符的ASCII值都远大于9,导致这些字符都不会被计数到counter里。 - 比如输入
59G71341,代码里的counter只会统计到0个数字(因为'5'的ASCII是53,远大于9),所以counter <=5的条件成立,加上字符串长度≥5,就误判为Valid。
修复方案
把判断数字的条件改成基于字符本身的比较:
if ((secretStr[i] >= '0') && (secretStr[i] <= '9'))
或者使用C++标准库的isdigit函数(需要包含<cctype>头文件):
#include <cctype> // ... if (isdigit(secretStr[i]))
内容的提问来源于stack exchange,提问作者Gabriel Zuniga
相关产品推荐
相关产品推荐

