用 std::getline() 读整行,遇换行符停止并保留空格;若前有 cin >> 操作,需先调用 cin.ignore() 清缓冲区;输入失败时须用 cin.clear() 重置状态并用 cin.ignore() 清除错误输入。

cin 读字符串时遇到空格就停了,怎么读整行?
默认 cin >> 遇到空格、制表符或换行就结束,根本读不到带空格的输入。比如用户输 "Hello World",cin >> str 只拿到 "Hello"。
用 std::getline() 替代:
std::string line; std::getline(std::cin, line);
- 它读到换行符为止,保留中间所有空格
- 注意:如果前面用了
cin >>(比如读了个数字),输入缓冲区里还留着一个换行符,getline()会立刻读到它并返回空字符串——得先调用cin.ignore()清掉 -
getline()是阻塞的,没输完不会往下走,符合“等待输入”的需求
输入失败后 cin 进入失效状态,后续读取全被跳过
用户输了个字母,你却用 cin >> num(num 是 int),cin 会设 failbit,之后所有输入操作都直接返回,不等用户输——看起来像“卡住”或“跳过了”。
必须手动恢复:
立即学习“C++免费学习笔记(深入)”;
int x;
if (!(std::cin >> x)) {
std::cin.clear(); // 清除错误标志
std::cin.ignore(10000, '\n'); // 丢掉当前行剩余内容
}
-
clear()不清缓冲区,只重置状态;ignore()才真正把坏输入扔掉 - 第二个参数
'\n'表示遇到换行就停,避免无限阻塞;第一个参数给个足够大的数(比如 10000)防缓冲区溢出 - 不处理这个,下次
getline()或cin >>都会立即失败
Windows 控制台下按 Ctrl+Z 才结束输入,Mac/Linux 是 Ctrl+D
这是终端行为,不是 C++ 问题。但新手常以为程序写错了——其实 cin 检测到 EOF 就停止,而不同系统触发 EOF 的快捷键不同。
- Windows:输入完成后按
Ctrl+Z回车(单独Ctrl+Z不生效) - macOS / Linux:按
Ctrl+D(不需要回车) - 在代码里判断 EOF 可用
if (!std::cin)或while (std::cin >> x) - 如果只是本地调试,别纠结这个,用
getline()+ 明确输入约定(比如空行结束)更可控
想等用户按任意键继续,cin 不行,得用平台 API
cin 等的是“完整行”,不是“任意键”。想实现类似 Windows 的 pause 效果(按一下就走),C++ 标准库没提供跨平台方案。
- Windows 下可用
_getch()(头文件<conio.h>),不回显、不需回车 - Linux/macOS 没对应标准函数,得临时改终端模式(用
termios),复杂且易出错 - 真要“按任意键继续”,建议只在开发调试时用,上线逻辑别依赖它;或者直接提示用户输
"q"或回车,用getline()处理更稳妥
cin.clear() 和 cin.ignore() 的组合。一出错就卡住,不是代码卡,是状态没清。











