cin.get()将换行符作为普通字符读取并保留,cin.getline()则识别为行结束标记并自动丢弃;两者均受>>遗留换行符影响,需用cin.ignore()清理。

cin.get() 会吃掉换行符,cin.getline() 也会但行为更可控
两者都从输入缓冲区读取字符,但 cin.get() 默认只读一个字符(包括换行符),而 cin.getline() 读一行直到遇到换行符或达到缓冲区上限。关键区别不在“是否吃换行符”,而在于“吃之后怎么处理”——cin.get() 把换行符当作普通字符收走;cin.getline() 明确将其识别为行结束标记,并自动丢弃(不存入目标数组/字符串)。
常见错误现象:cin >> x; 后紧跟 cin.getline(buf, 100),结果 buf 为空——因为 >> 留下了换行符,getline 立刻读到它就停了。
- 用
cin.ignore()清掉残留换行符(如cin.ignore(1, '\n')或更稳妥的cin.ignore(numeric_limits)::max(), '\n') -
cin.get()无参数时等价于cin.get().get(),返回int(可区分 EOF),别用char接收 -
cin.getline()遇到缓冲区满会置位failbit,需检查cin.fail()
cin.get() 有三种重载,cin.getline() 只有一种标准用法
cin.get() 支持:单字符读取(cin.get(c))、流式读取(cin.get() 返回 int)、C 风格缓冲区读取(cin.get(buf, size))。注意第三种和 cin.getline() 表面相似,实则不同:
-
cin.get(buf, size):遇到换行符停止,**保留换行符在缓冲区中**,下次读仍会碰到它 -
cin.getline(buf, size):遇到换行符停止,**自动移除并丢弃该换行符** - 两者都对
size解释一致:最多读size - 1个字符,末尾加\0
示例:char buf[5]; cin.get(buf, 5); 输入 abc\n → buf = "abc",缓冲区还剩 \n;同输入下 cin.getline(buf, 5) → buf = "abc",缓冲区已清空。
立即学习“C++免费学习笔记(深入)”;
用 string 版本 getline 时,cin.get() 完全不兼容
std::getline(cin, s) 是独立函数(定义在 ),和 cin 成员函数无关。它不会受 cin.get() 调用影响,但依然会被前面的 >> 留下的换行符干扰。
- 不要混用:
cin >> x;后直接getline(cin, s)→s得到空串 - 修复方式统一:在
>>后加cin.ignore(),不是换get()或改getline() -
cin.get()对string无直接支持,想逐字符读 string 应用cin.get(c)循环 +push_back,但通常没必要
缓冲区溢出风险:cin.getline() 比 cin >> 更安全,但仍有陷阱
cin >> 遇空格/换行即停,不检查长度,容易因超长输入导致数组越界(尤其配合 char[] 使用时);cin.getline() 显式限定长度,是更安全的 C 风格行读取方式。
- 但若传入的
size小于实际所需(如char buf[10]却调用cin.getline(buf, 10)),读 9 字符后填\0,第 10 位被忽略——这本身不越界,但可能截断数据 - 真正危险的是误用
cin.get(buf, size)且未检查failbit:它不丢换行符,后续读取逻辑可能卡死或错位 - 现代 C++ 优先用
std::getline(cin, s),自动管理内存,规避所有缓冲区尺寸问题
最容易被忽略的是:所有这些函数对输入失败(如 EOF、流关闭)的响应不一致,cin.get() 返回 EOF(-1),cin.getline() 置位 failbit,而 std::getline() 返回流引用——判断失败不能只看返回值类型,得查状态位。











