You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

修改说明

  1. 输入部分符合要求使用cin.get()实现整行读取,通过C风格字符数组承接输入后转换为std::string处理,支持读取带空格的完整句子。
  2. 新增预处理步骤,过滤所有非字母字符并统一转为小写,消除大小写、空格、标点符号对回文判断的影响。
  3. 调整递归函数的边界判断顺序,优先处理长度小于等于1的情况,避免数组越界问题。

内容的提问来源于stack exchange,提问作者asang003

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 01:57:01