需清空输入缓冲区以避免残留字符干扰后续读取,如cin>>后接getline()时换行符导致空读;常用cin.ignore(1000,'\n')或更安全的cin.clear();cin.ignore(numeric_limits::max(),'\n');
清空输入缓冲区常用 cin.ignore(),它能跳过缓冲区中指定数量或特定字符前的字符,避免残留输入干扰后续读取。
当混合使用 cin >> 和 getline() 时容易出问题。比如先用 cin >> num 读整数,回车后换行符 \n 会留在缓冲区;紧接着调用 getline(cin, str) 就会立刻读到这个 \n,导致 str 为空。这不是 bug,而是输入行为的自然结果。
它有两个常用重载形式:
cin.ignore(n, delim):最多忽略 n 个字符,直到遇到 delim(含)为止;delim 默认是 EOF
cin.ignore():等价于 cin.ignore(1, EOF),只忽略 1 个字符最常用的是跳过一行残留,写成:
cin.ignore(1000, '\n');
这里 1000 是一个足够大的数(远超单行预期长度),确保把从当前位置到下一个 \n 的所有字符都丢弃,包括 \n 本身。
如果之前输入操作失败(如用户输了字母却用 cin >> int 读),流状态可能变为 failbit,此时 ignore() 不会执行。应先恢复状态:
cin.clear(); —— 清除错误标志(如 failbit、badbit)cin.ignore(numeric_limits::max(), '\n'); —— 安全跳过整行需包含头文件:#include 。完整示例:
cin.clear();
cin.ignore(numeric_limits::max(), '\n');
fflush(stdin) —— C++ 标准不保证其行为,且在多数编译器(如 GCC、Clang)上是未定义的ignore(99999, '\n'),用 numeric_limits::max() 更规范>> 后接 getline
)或输入异常后才需要