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

从文件读取的string变量输出时被覆盖,如何解决?

解决getline读取文件后打印内容被覆盖的问题

问题原因

你的输出出现内容覆盖,是因为读取的文件采用Windows格式换行(换行符为\r\n),而在bash环境下,getline仅会剔除换行符\n,将回车符\r保留在了字符串末尾。打印时,\r会强制光标回到行首,后续的附加文本就会覆盖掉字符串本身的内容。

另外,你的回文检查函数存在越界访问问题:循环条件i <= phrase.length()会导致当i等于字符串长度时,访问phrase[i](字符串索引范围是0到length()-1),触发未定义行为。

修复方案

  1. 移除字符串末尾的回车符:每次读取行后,检查并移除可能存在的\r。
  2. 修复回文函数的循环逻辑:将循环条件改为只遍历字符串前半部分,避免越界,同时优化退出逻辑。

修改后的完整代码

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

bool CheckIfPalindrome(string phrase);

int main() {
    ifstream inputFile;

    inputFile.open("p.txt");
    
    string line;
    bool isPalindrome;

    while(getline(inputFile, line)){
        // 移除Windows格式换行留下的\r
        if (!line.empty() && line.back() == '\r') {
            line.pop_back();
        }
        
        isPalindrome = CheckIfPalindrome(line);
    
        if (isPalindrome) {
            cout << line << " is a palindrome" << endl;            
        } else {
            cout << line << " is not a palindrome" << endl;
        }
    }
    
    inputFile.close();
    return 0;
}

// 检查短语是否为回文
bool CheckIfPalindrome(string phrase) {
    bool isPalindrome = true;
    size_t len = phrase.length();
    
    // 只遍历前半部分,对比对应位置的字符
    for (size_t i = 0 ; i < len / 2 ; i++) {
        if (phrase[i] != phrase[len - i - 1]){
            isPalindrome = false;
            break; // 发现不匹配直接退出循环
        }
    }
    
    return isPalindrome;
}

额外说明

如果你的文件是在Linux环境下创建的,仍出现类似问题,可以检查文件是否存在其他控制字符。另外,使用break替代i=100的退出方式更规范,也避免了硬编码数值带来的潜在问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 10:17:33