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键吗?
答案 0 :(得分:0)
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 );