从文件读取的string变量输出时被覆盖,如何解决?
解决getline读取文件后打印内容被覆盖的问题
问题原因
你的输出出现内容覆盖,是因为读取的文件采用Windows格式换行(换行符为\r\n),而在bash环境下,getline仅会剔除换行符\n,将回车符\r保留在了字符串末尾。打印时,\r会强制光标回到行首,后续的附加文本就会覆盖掉字符串本身的内容。
另外,你的回文检查函数存在越界访问问题:循环条件i <= phrase.length()会导致当i等于字符串长度时,访问phrase[i](字符串索引范围是0到length()-1),触发未定义行为。
修复方案
- 移除字符串末尾的回车符:每次读取行后,检查并移除可能存在的
\r。 - 修复回文函数的循环逻辑:将循环条件改为只遍历字符串前半部分,避免越界,同时优化退出逻辑。
修改后的完整代码
#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
相关产品推荐
相关产品推荐

