奇怪的标准输出行为
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) -这被转换为没有换行的回车-导致您所看到的行为。
相关文章:
- 捕获标准输出以压缩并使用 CTRL-C 中断会给出损坏的 zip 文件
- 使用提升过程获取 shell 命令的标准输出
- 将标准输出重定向到ostream
- 如何在C++中执行命令并获取命令的返回代码标准输出和标准
- 在程序执行期间从标准输出重定向到自定义流
- 标准输出C++意外行为
- 防止 qDebug() 写入标准输出
- C++ - <<运算符重载,链表 - 地址而不是标准输出
- 有没有办法知道C++中将打印到标准输出的大小?
- 最后推迟标准输出
- 得到~对标准输出没有回应~在黑客排名问题上
- Win32 GUI C(++) 应用将标准输出和标准输出重定向到磁盘上的同一文件
- 在标准输出中执行打印会导致数组中随机分配值
- 捕获远程进程子进程的标准输出
- 使用 QProcess 读取标准输出
- 如何将值发送到标准输出流并在另一个程序中访问这些值
- 无法使用创建进程重定向标准输出
- HackerRank说~对标准输出没有回应~.C++
- 记录标准输入和标准输出
- 我可以重定向两个子进程的标准输出吗?