gpt4 book ai didi

c++ - 在 cout 中打印 getline() 字符串时出现奇怪的错误

转载 作者:行者123 更新时间:2023-11-28 02:44:59 25 4
gpt4 key购买 nike

当我在测试用例的输入中遇到一个奇怪的问题时,我正在尝试测试我的类。我试图简化输入以查看出了什么问题,因此我创建了下面的程序。

#include <iostream>
#include <string>

int main()
{
std::string number;
while (std::getline(std::cin, number))
{
std::cout << std::string(number) << " ";
}
}

基本上,我获取每一行文本并使用 getline() 将其存储在一个字符串变量中。然后我使用 std::cout 显示每个字符串并附加一个空格字符。

我的输入文件包含这个:

one six
one seven

预期的输出应该是这样的:

one six one seven

但相反,我得到了这个:

 one seven

这是一个空格字符,后跟输入的第二行。它忽略第一行输入。我知道每一行都被正确读取了,因为当我用这个替换代码时它们被正确显示了:

std::cout << std::string(number) << std::endl;

这个错误对我来说很新。这里发生了什么事?有人可以解释吗? TIA!

最佳答案

好的,很清楚。

您的输入文件必须是:一六\r\nt二七\r\n,具有正常的 Windows EOL。

在cygwin下读取时,先读取one six\r,只有\ngetline吃掉,和第二行相同的一七\r

所以你写:一六\r 一七\r(以空白结尾)。但是 \r 单独将 curson 放回同一行的第一列,第二行首先删除。

通常情况下,如果您将结尾空白替换为 std::eol 并将光标置于新行,则问题不可见。制表符 (\t) 如果真的是一个特例:它将光标准确地放在您期望的第八列上,但这纯属偶然。如果将两条线倒置,它会更明显,因为您会在第二条线的末尾看到第一条线的剩余部分。

您可以通过将输出写入文件并进行编辑来确认。

我可以在带有 Windows EOL 的 Linux 下重现它。这样做的原因是 Cygwin 非常模仿 Unix-Linux 并仅使用 \n 的 Unix EOL 约定。

关于c++ - 在 cout 中打印 getline() 字符串时出现奇怪的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24721590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com