关于cin.get()与while循环交互的困惑及技术咨询
问题解答
核心原因:Windows控制台的EOF触发规则和你想的不一样
在Windows(Visual Studio的运行环境)的控制台中,Ctrl+Z(EOF标记)的触发有严格规则:
- 只有当
Ctrl+Z是一行的第一个字符,或者位于输入流的末尾(当前行没有未处理的剩余字符)时,才会被识别为EOF,让cin.get()返回EOF并终止循环。 - 如果把
Ctrl+Z插在一行内容中间,它会被当成普通的可显示字符(就是你看到的^Z),cin.get()会正常读取它,循环自然不会停止。
看你的测试过程
你输入Testing ^z sentence 2时,^Z在句子中间,所以被当成普通字符读取,程序会原样输出这行内容,继续等待下一次输入。直到你单独输入一行^Z时,才满足EOF触发条件,循环才会终止。
正确的测试操作
要让循环正常终止,按以下步骤来:
- 输入你要测试的内容,比如
Testing sentence 1,按回车; - 直接按
Ctrl+Z,再按回车(或者输入完内容后,直接在末尾按Ctrl+Z);
这时候cin.get()就会读取到EOF,循环立刻停止。
补充知识点
当cin读取到EOF后,会把自身的EOF状态位置为true,之后所有对cin的读取操作都会直接返回EOF。如果之后还想继续使用输入流,需要调用cin.clear()来清除这个状态位,但你的示例程序里循环结束后就退出了,所以不需要这步操作。
内容的提问来源于stack exchange,提问作者alexander sze
相关产品推荐
相关产品推荐

