为何首次按回车后后续cin.get()语句被跳过?(VS2022环境)
cin.get()被直接跳过的原因分析
问题场景
在Visual Studio 2022中运行这段1998年教材里的C++代码时,完成第一个输入并按下回车后,后续的cin.get()语句会直接跳过,不会等待用户输入:
#include <iostream> using namespace std; int main() { char string[21]; cout << "Enter a string: "; cin.get(string, 20); cin.ignore(80, '\n'); cout << "\nPress Enter to continue.\n"; cin.get(string, 20); cin.ignore(80, '\n'); cout << "\nPress Enter to continue.\n"; cin.get(string, 20); cin.ignore(80, '\n'); cout << "\nPress Enter to continue.\n"; cin.get(string, 20); cin.ignore(80, '\n'); }
核心原因
问题出在cin.get(char*, size)的行为逻辑上:
cin.get(char*, size)会从输入缓冲区读取字符,直到遇到默认分隔符'\n'或者读满size-1个字符时停止。关键是,它不会把触发终止的分隔符从缓冲区中移除,这个分隔符会留在缓冲区里。- 第一个输入后的
cin.ignore(80, '\n')是正确的:它会忽略最多80个字符,直到找到并跳过换行符,清空缓冲区。 - 后续的“按回车继续”环节:当你直接按回车时,缓冲区里只有一个
'\n'。此时cin.get(string,20)一碰到这个分隔符就直接终止读取,不会往string里写入任何内容,同时这个'\n'还留在缓冲区。紧接着的cin.ignore()会跳过这个换行符,导致整个流程看起来像是cin.get()被“跳过”——实际上它是直接触发了终止条件,根本没等待新的输入。
本质是:cin.get(char*, size)把空输入(直接按回车)当成了合法的终止信号,而不是需要等待用户输入有效内容的状态。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

