C++使用cin.get()实现递归回文判断的异常问题求解
问题排查与修复方案
核心问题梳理
- 输入读取逻辑错误:无参数调用
cin.get()仅会读取单个字符且未存入目标变量,导致判断用的字符串始终为空;cin.get()无法直接读取到std::string类型,cin.get(str, 0)的写法第二个参数为读取的最大字符数,传0属于非法调用会直接报错。 - 回文判断逻辑存在越界风险:现有代码先读取字符串首尾字符再判断长度,当字符串长度为0时会触发数组越界,出现未定义行为。
- 缺少预处理逻辑:未过滤空格、标点等非字母字符,也没有统一大小写,无法对带格式的整句做回文判断。
修复后完整代码
// 回文判断程序 #include <iostream> #include <string> #include <cctype> using namespace std; // 预处理:过滤非字母字符,统一转小写 string preprocess(string s) { string res; for (char c : s) { if (isalpha(c)) { res += tolower(c); } } return res; } // 递归判断回文 bool isPalindrome(string str) { int leng = str.length(); // 先判断边界,避免越界 if (leng <= 1) { return true; } char ch1 = str[0]; char ch2 = str[leng - 1]; if (ch1 != ch2) { return false; } return isPalindrome(str.substr(1, leng - 2)); } int main() { char buf[1024]; // 用char数组承接cin.get的输入 cout << "Enter a line that might be a palindrome: " << endl; cin.get(buf, 1024); // 读取整行输入,最多读1023个字符 string str(buf); string processed = preprocess(str); bool pal = isPalindrome(processed); if (pal) { cout << "The string is a palindrome." << endl; } else { cout << "The string is NOT a palindrome." << endl; } return 0; }
修改说明
- 输入部分符合要求使用
cin.get()实现整行读取,通过C风格字符数组承接输入后转换为std::string处理,支持读取带空格的完整句子。 - 新增预处理步骤,过滤所有非字母字符并统一转为小写,消除大小写、空格、标点符号对回文判断的影响。
- 调整递归函数的边界判断顺序,优先处理长度小于等于1的情况,避免数组越界问题。
内容的提问来源于stack exchange,提问作者asang003
相关产品推荐
相关产品推荐

