为啥只有在 Windows 控制台程序中按 Ctrl+Z 时才会终止输入? [复制]

Posted

技术标签:

【中文标题】为啥只有在 Windows 控制台程序中按 Ctrl+Z 时才会终止输入? [复制]【英文标题】:Why is input only sometimes terminated when I press Ctrl+Z in a Windows console program? [duplicate]为什么只有在 Windows 控制台程序中按 Ctrl+Z 时才会终止输入? [复制] 【发布时间】:2013-10-22 18:12:35 【问题描述】:

我知道使用 ctrl-z 来表示 EOF 或 EOT 通常已过时且不推荐,但我只是对幕后发生的事情感到好奇。

假设我在 C++ 中有这样的东西:

#include <iostream>
#include <string>

int main() 
    while (!cin.eof()) 
        string str;
        getline(cin, str);
    
    cout << "out of while" << endl;
    return 0;

如果我执行 abc[^Z][newline],程序仍然运行。与 abc[^D][newline] 相同。

但如果我输入的一行纯粹包含[^Z][newline],则程序正常存在。

我知道它可能是特定于操作系统的,但我只是好奇那里发生了什么。

【问题讨论】:

Windows/DOS 并不以在命令行中有用而闻名。尝试向 Cygwin/MSYS 人员询问他们尝试使程序在 bash 和 cmd.exe 上运行的经验。顺便说一句,while (!cin.eof()) 是不好的形式;不会改变您的结果,但几乎在所有情况下都是不正确的。 【参考方案1】:

首先,这篇文章对 Ctrl-Z(DOS / Windows)和 Ctrl-D(UNIX / Linux)有一些很好的了解:http://latedev.wordpress.com/2012/12/04/all-about-eof/

非常值得一读。它还指出了上面的 while 循环存在问题。

最重要的是,Ctrl-Z 不表示 EOF。但是,当它是该行的第一个字符时,大多数从控制台读取的 Windows 程序将其识别为输入的结尾。结果实际上是cin 上的EOF。实际上,以文本模式打开的文件可能表现相同,尽管 C++ 标准中没有任何要求。

请注意,从历史上看,用于输入结束的 Ctrl-Z 必须位于行首。行中其他地方的 Ctrl-Z 没有相同的效果。

【讨论】:

以上是关于为啥只有在 Windows 控制台程序中按 Ctrl+Z 时才会终止输入? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

boostrap之弹出框(popover),控制只有一个只显示框

在 Visual Studio Code 中按名称查找文件

在WINDOWS XP操作中按哪个键可以随时获得联机帮助

如何检查是不是已在 Ruby 和 Windows 控制台中按下箭头键

当我在android中按回为啥不退出应用程序?

为啥在laravel中按下浏览器的后退按钮时过滤器不起作用?