gpt4 book ai didi

windows - 终端中的 Ctrl+Z 行为

转载 作者:可可西里 更新时间:2023-11-01 10:42:23 24 4
gpt4 key购买 nike

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、看前面有没有字符,第二个例子为什么要按两次回车?

最佳答案

26是你平台上的^Z代码,^Z是终端的EOF标记,没错。代码小于 32 的字符是 ASCII 兼容平台的控制字符,希望你知道。 26 不是替代字符,它是实际控制代码,^Z 或某些“bug”字符是替代字符。 getline读取输入,直到在流中遇到EOL(end-of-line,ASCII指定为CR)或EOF(end of file,end of stream,指定为SUB),所以读取到^Z第二次调用 getline。这种行为是绝对正确的。

它是由平台定义的(或者更准确地说,是由终端类型定义的)如果字符是立即发送到输入缓冲区还是在一些刷新命令发生之后。缓冲区刷新的通常原因是 EOL 字符,即您的 ENTER(CR - 回车)。在您的情况下,这就是程序在 Enter 之后收到 EOF 的原因。请注意,有些平台使用 LF(换行)作为 EOL,有些平台使用一对 LF+CR。 C 文字 '\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

关于windows - 终端中的 Ctrl+Z 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45665230/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com