用 std::getline(cin, str) 读整行,注意前有 cin>> 时需先调 cin.ignore() 清残留换行符;输入失败要同时调 cin.clear() 和 cin.ignore() 恢复;禁止混用 cin 与 scanf;循环读取应设结束标记而非依赖 EOF。

cin 读字符串时遇到空格就停了,怎么读整行?
cin 默认以空白符(空格、制表符、换行)为分隔,所以 cin >> str 只能读一个单词。想读带空格的一整行,得换函数。
- 用
std::getline(cin, str),它按换行符截断,保留中间的空格 - 注意:如果前边刚用过
cin >>,输入缓冲区里可能残留换行符,getline会立刻读到它,返回空行;这时得先调cin.ignore()清掉 -
getline第二个参数必须是std::string,不能传char[](除非用带缓冲区版本cin.getline(buf, size))
std::string name; cin >> age; // 读数字 cin.ignore(); // 跳过换行 std::getline(cin, name); // 现在才能读带空格的名字
输入失败后 cin 进入失效状态,后续读取全被跳过
cin 遇到非预期输入(比如要读 int 却输了个字母),会置位 failbit,之后所有输入操作都直接返回,不阻塞也不读数据。
- 检查是否失败:用
cin.fail()或直接当布尔值用(if (!cin) {...}) - 恢复可用:必须同时调
cin.clear()清错误标志,再用cin.ignore()清缓冲区残留(否则坏字符还在那儿,下次还失败) - 常见陷阱:只清标志不忽略输入,或只忽略不清理标志,两者缺一不可
int x;
cin >> x;
if (!cin) {
cin.clear();
cin.ignore(10000, '\n'); // 忽略最多10000个字符直到换行
}
cin 和 scanf 混用导致输入错乱
C++ 流和 C 标准库流默认共享同一缓冲区,但缓冲策略不同。cin 可能带缓冲,scanf 可能不刷新,混用极易丢数据或死等。
- 绝对避免在同一程序里交替用
cin和scanf(尤其读同一类输入) - 如果必须用 C 风格输入,统一用
scanf+printf;若用 C++ 风格,全程用cin/cout - 不要用
ios_base::sync_with_stdio(false)来“加速”却混用——它会解耦缓冲,让混用行为更不可预测
cin 在循环里反复读不到新输入
典型现象:循环中写 while (cin >> x) { ... },输完数据后程序不退出,卡住。
立即学习“C++免费学习笔记(深入)”;
- 这不是 bug,是
cin在等待更多输入;它只在遇到文件结束符(EOF)或流错误时才跳出 - Windows 下手动触发 EOF 是
Ctrl+Z回车,macOS/Linux 是Ctrl+D - 更可控的做法是约定结束标记,比如输入
-1表示结束,然后用普通条件判断
int x;
while (cin >> x && x != -1) {
// 处理 x
}
真正麻烦的是缓冲区残留和状态位管理——这两点不处理好,cin 行为就完全不可控。











