这是我的代码的一部分。我不知道为什么该字符串被另一个字符串部分覆盖。
for(int xd = 0 ; xd < 10; xd++)
{
if(booklist[xd].length() != 0)
{
string d = string(booklist[xd]);
string e = "1,2,3,4";
string f = d + e;
cout << d.length() << endl;
cout << d << endl;
cout << f.length() << endl;
cout << f << endl;
}
}
这段代码的结果是:
16
brave new world
23
1,2,3,4ew world
28
nineteen eighty-four (1984)
35
1,2,3,4n eighty-four (1984)
我不知道为什么我得到这个错误的结果。 有人可以帮助我吗?
您是否通过从 Windows 复制到 Linux 计算机的文件中拉取来填充
booklist
?
Windows 除了换行符之外还会在每行末尾添加回车符
'\r'
。如果您正在读取 Windows 文件并使用 getline
,它会将回车符拉入字符串中。
当在终端中输出回车符时,它将光标重置到行的开头,这将导致您所看到的行为。
要解决此问题,请参阅此问题,了解如何从字符串中删除空格。您从该答案中寻找的功能是
rtrim
(或“右修剪”):
// trim from end (in place)
static inline void rtrim(std::string &s) {
s.erase(std::find_if(s.rbegin(), s.rend(), [](int ch) {
return !std::isspace(ch);
}).base(), s.end());
}
您的
booklist
条目可能有尾随回车符,导致第 4 行(例如)打印 brave new world
,返回到第 1 列,并在其上打印 1,2,3,4
。 (这就是为什么第 3 行的字符数比第 1 行多,尽管这两行的表观长度相同。)
从
booklist
条目中删除尾随空白(或者首先找出它为什么进入那里,然后处理它),事情应该没问题。
是的,我知道它显示错误的原因了。 就像 scohe001 所说的:当我使用
getline
将文件放入数组时,它会在每个元素后面添加 \r
,所以我使用 substr
删除 \r
。现在它可以工作了。谢谢大家。