C++ 关于连接两个字符串

问题描述 投票:0回答:3

这是我的代码的一部分。我不知道为什么该字符串被另一个字符串部分覆盖。

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)

我不知道为什么我得到这个错误的结果。 有人可以帮助我吗?

c++ string
3个回答
3
投票

您是否通过从 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());
}

1
投票

您的

booklist
条目可能有尾随回车符,导致第 4 行(例如)打印
brave new world
,返回到第 1 列,并在其上打印
1,2,3,4
。 (这就是为什么第 3 行的字符数比第 1 行多,尽管这两行的表观长度相同。)

booklist
条目中删除尾随空白(或者首先找出它为什么进入那里,然后处理它),事情应该没问题。


0
投票

是的,我知道它显示错误的原因了。 就像 scohe001 所说的:当我使用

getline
将文件放入数组时,它会在每个元素后面添加
\r
,所以我使用
substr
删除
\r
。现在它可以工作了。谢谢大家。

© www.soinside.com 2019 - 2024. All rights reserved.