奇怪的标准输出行为

Strange stdout behavior

本文关键字:标准输出      更新时间:2023-10-16

我目前正在用c++编写一个套接字程序,由于某种原因,当我试图向控制台写入时,我偶然发现了非常奇怪的行为。

cout << themsg[0] << themsg[1] << endl;
cout << "Phase 3: Supernode sent the message " << themsg[0] << " on dynamic port number " << themsg[1] << endl;

themsg[0]是字符串"User#2:What's up Dick?"

themsg[1]是字符串"39416"

第一行应该写"用户#2:What's up Dick?"到控制台,后面跟着"39416"。

第二行应该打印"阶段3:超级节点发送消息用户2:怎么了,迪克?"动态端口号39416"

控制台输出如下所示:

394162:What's up Dick?
on dynamic port number 39416essage User#2:What's up Dick?

我知道themsg[0]和themsg[1]是正确的,因为我将它们的值写入了一个文件以进行验证。这肯定是一些奇怪的标准输出问题。

对于第一行,似乎themsg[1]的5个字符覆盖了themsg[0]的前5个字符。对于第二行,似乎忽略了cout的前两个参数,然后附加了一个消息片段。

如果有人能帮忙,我将非常感激。我尝试使用flush(),但无济于事。我不是很确定输出缓冲区是如何工作的,所以我真的失去了这个。

您可能在themsg[0]的末尾有一个回车符号r。我可以在Linux上使用以下程序重现此行为:

int main()
{
    std::cout << "User#2: what's up?r" << "39416" << std::endl;
}

r,当没有后跟n时,具有将终端的虚拟"回车"返回到行开头的效果,因此下一次打印将覆盖已经在那里的内容。但是,您不会在文件中看到这一点,因为文件将只包含两个字符串,包括CR。

打印前去掉r

我怀疑问题出在你的themes变量上。我测试了您的确切设置-并且,在适当的值下,它可以正常工作。然而,我随后测试了相同的设置,但将r附加到themsg[1]themsg[2]的末尾-并得到了您的行为。由于您的字符串themsg[1]来自网络,它可能包含行结束-并且来自不同的操作系统(例如UNIX与Windows) -这被转换为没有换行的回车-导致您所看到的行为。