C++纯字母输入校验逻辑失效,二次输入无效字符串绕过限制问题
代码问题根因
- 语法错误:
return IsLetters是返回函数指针而非调用递归校验函数,非空函数指针会被隐式转换为布尔值true,直接导致后续所有输入都判定为校验通过。 - 逻辑缺陷:检测到非法字符重新获取输入后,没有对新输入执行完整校验流程。
- 兼容性问题:缺少
<cctype>头文件引用,且toupper直接传入带符号char可能触发未定义行为。
修复后代码(兼容原有递归逻辑)
#include <iostream> #include <string> #include <cctype> using namespace std; bool IsLetters(string &input) { for (int i = 0; i < input.size(); i++) { int uppercaseChar = toupper(static_cast<unsigned char>(input[i])); if (uppercaseChar < 'A' || uppercaseChar > 'Z') { cout<<"try again\n"; cin>>input; // 递归校验新输入的字符串,返回校验结果 return IsLetters(input); } } return true; } int main() { string x; cout<<"enter your name\n"; cin>>x; if (IsLetters(x)) { cout << "your name is\n"<<x; } return 0; }
更稳妥的实现(循环替代递归,避免栈溢出风险)
把输入重试逻辑放到外层,校验函数只负责判断字符串是否符合要求,职责更清晰:
#include <iostream> #include <string> #include <cctype> using namespace std; bool IsLetters(const string &input) { for (unsigned char c : input) { int uppercaseChar = toupper(c); if (uppercaseChar < 'A' || uppercaseChar > 'Z') { return false; } } return true; } int main() { string x; cout << "enter your name\n"; cin >> x; // 循环校验直到输入符合要求 while (!IsLetters(x)) { cout << "try again\n"; cin >> x; } cout << "your name is\n" << x; return 0; }
内容的提问来源于stack exchange,提问作者VMX SIDD
相关产品推荐
相关产品推荐

