C++实现密码输入与合规性校验的代码错误排查及实现求助
C++ 密码校验程序问题修复方案
现有代码核心缺陷
- 函数结构错误:
main函数的大括号位置错误,所有输出语句被写在函数体外,编译器无法识别cout等标准库对象 - 语法错误:
else if分支逻辑混乱,存在冗余的判断语句、多余括号,多处字符串漏写闭合双引号 - 变量未定义:直接使用未声明的
password、input变量,变量传递逻辑不匹配 - 校验逻辑错误:
- 特殊字符校验规则不符合要求,当前逻辑将所有非字母/数字/空格的字符都判定为合法特殊字符,需求仅允许
!@#$四个特殊字符 - 空白字符校验逻辑缺失,且使用
cin >>读取输入会自动跳过空白,无法校验密码是否包含空白 find_first_not_of被放在循环内重复执行,属于无效冗余操作
- 特殊字符校验规则不符合要求,当前逻辑将所有非字母/数字/空格的字符都判定为合法特殊字符,需求仅允许
修正后的完整代码
#include <iostream> #include <string> #include <cctype> using namespace std; // 校验密码是否符合要求 void checkPassword(const string& input) { int len = input.length(); bool hasLower = false, hasUpper = false, hasDigit = false, hasSpecial = false, hasSpace = false; const string allowedSpecial = "!@#$"; const string whitespace = " \t\n\r"; for (unsigned char c : input) { // 范围for循环遍历每个字符,转unsigned char避免ctype函数未定义行为 if (islower(c)) hasLower = true; else if (isupper(c)) hasUpper = true; else if (isdigit(c)) hasDigit = true; else if (allowedSpecial.find(c) != string::npos) hasSpecial = true; else if (whitespace.find(c) != string::npos) hasSpace = true; } // 按需求校验所有条件 if (len >= 8 && !hasSpace && hasLower && hasUpper && hasDigit && hasSpecial) { cout << "Valid" << endl; } else { cout << "Invalid" << endl; } } int main() { cout << "Please enter your password.\n"; cout << "Your password must meet the following rules:\n"; cout << "- At least 8 characters long\n"; cout << "- No whitespace characters ( ' ', '\\t', '\\n', '\\r' )\n"; cout << "- At least 1 digit (0-9)\n"; cout << "- At least 1 lowercase letter (a-z)\n"; cout << "- At least 1 uppercase letter (A-Z)\n"; cout << "- At least 1 special character from: !@#$" << endl; string password; getline(cin, password); // 读取整行输入,包含空格,方便校验空白字符 checkPassword(password); return 0; }
关键修改说明
- 重构了
main函数结构,所有逻辑放在函数大括号内,修复了cout无法识别的报错 - 补全了所有字符串的闭合双引号,删除了冗余的错误判断语句
- 重写了校验逻辑:单独判断空白字符、仅允许指定的四个特殊字符,遍历一次字符即可完成所有校验,效率更高
- 使用
getline读取整行输入,支持校验包含空格的密码
C++ 用户输入基础说明
C++ 读取用户输入的常用方式和Python对应关系如下:
- 读取不带空格的字符串:
string s; cin >> s;,相当于Python的s = input().split()[0] - 读取整行输入(包含空格):
string s; getline(cin, s);,完全等价于Python的s = input() - 读取数字等其他类型:
int num; cin >> num;,相当于Python的num = int(input())
内容的提问来源于stack exchange,提问作者user16011538
相关产品推荐
相关产品推荐

