终端中的Ctrl + Z行为

时间:2017-08-13 21:50:47

标签: windows c++11 iostream windows-console

string s;
while(getline(cin,s)){
    cout << "---" << endl
    for(auto c: s) cout << int(c) << endl;   
}
cout << "Exiting";

如果我的输入是 Ctrl + Z ,那么我按一次回车键,我的程序会立即退出。

^Z
Exiting

如果我在按 Ctrl + Z 之前输入一个字符,那么我必须按两次输入,我的程序不会退出。

s^Z

---
115
26

我总是将 Ctrl + Z 解释为EOF字符。 getline将一直持续到达此角色,此时getline测试为false,我的程序将退出。我很好奇为什么我的程序将 Ctrl + Z 解释为substitute character 26,具体取决于是否有前面的字符,以及为什么有必要我可以在第二个例子中按两次Enter键吗?

1 个答案:

答案 0 :(得分:0)

26是您平台上^ Z的代码,^ Z是终端的EOF标记,这是真的。代码小于32的字符是ASCII兼容平台的控制字符,希望你知道。 26不是替代字符,它是实际控制代码,^ Z或某些“bug”字符是替代字符。 getline读取输入直到EOL(行尾,由ASCII指定为CR)或EOF(文件结尾,流结束,指定为SUB)在流中遇到,因此^ Z与第二个读取致电getline。这种行为绝对正确。

如果字符立即发送到输入缓冲区或者在发生一些刷新命令之后,它由平台(或者更准确地说,通过终端类型)定义。缓冲区刷新的常见原因是EOL字符,这是您的ENTER(CR - 回车)。 Tat为什么程序在您的案例中输入后收到EOF。请注意,某些平台使用LF(换行)作为EOL,有些 - 使用LF + CR。 C literal'\ n'将被正确翻译成特定的EOL标记。

注意,您可以使用不同的分隔符:

template< class CharT, class Traits, class Allocator > 
std::basic_istream<CharT,Traits>& getline( 
         std::basic_istream<CharT,Traits>& input,
         std::basic_string<CharT,Traits,Allocator>& str,
         CharT delim );

带替代Control +的ASCII表: enter image description here