cin >> str 会跳过空白并遇空格停止,导致读取不完整;应使用 getline(cin, str) 读整行,但需注意前序操作残留的换行符,建议在 cin >> 后调用 cin.ignore(numeric_limits<int>::max(), '\n')。

cin >> str 会跳过空白,读到空格就停
这是最常踩的坑:用 cin >> str 读用户输入的一整行(比如“Hello World”),结果 str 只拿到 "Hello",后面被截断了。因为 operator>> 默认以任意空白字符(空格、制表符、换行)为分隔,遇到第一个空格就停止读取,并把换行符留在输入缓冲区里。
适用场景:读单个单词、数字、标识符这类不含空格的输入;不适用于带空格的句子或路径。
- 如果前一次用了
cin >> num读整数,再用cin >> str,很可能直接跳过——因为换行符还在缓冲区,operator>>把它当空白跳过了 - 想清空缓冲区残留的换行符,得手动加
cin.ignore(),但别只写cin.ignore(),它默认只忽略 1 个字符;更稳妥的是cin.ignore(1000, '\n')
getline(cin, str) 读整行,包括空格但不包括换行符
getline() 是专门干这事的:从 cin 读取字符,直到遇到换行符('\n'),然后把换行符丢掉,字符串里不包含它。所以 “Hello World” 会完整进 str。
但注意:如果调用 getline() 前缓冲区里已经有换行符(比如刚用过 cin >> x),那 getline() 会立刻读到那个换行符,返回空字符串——看起来像“没输入”。
立即学习“C++免费学习笔记(深入)”;
- 必须确保调用前缓冲区干净,常见做法是在
cin >> x后紧跟cin.ignore() -
getline()第二个参数是std::string&,不能传char[];要用 C 风格数组就得用cin.getline(buf, size),但那是另一套接口 - 如果用户输超长内容(比如指定最大 100 字符,却输了 200),
getline()会截断,并设置failbit,记得检查cin.fail()
混用 cin 和 getline 时,缓冲区状态决定一切
不是函数本身有问题,而是输入流的状态在“接力”时容易出错。核心问题永远是:上一个操作有没有把换行符留在缓冲区?
典型错误链:cin >> age; → 用户输 25\n → age 得到 25,\n 还在缓冲区 → 紧接着 getline(cin, name) 立刻读到 \n,name 为空。
- 修复方式统一:在
cin >>后加cin.ignore(numeric_limits<streamsize>::max(), '\n')</streamsize>(需#include <limits></limits>) - 偷懒但够用的写法:
cin.ignore(10000, '\n'),只要用户不狂按回车,基本不会漏 - 如果整个程序只用
getline(),完全避开operator>>,反而最省心——数字也先读成string,再用stoi()或stod()转
用 string 还是 char[]?优先 string + getline
C++ 里该用 std::string 就别碰 char[]。前者自动管理内存,后者要自己算长度、防溢出、手动加 '\0',徒增风险。
getline(cin, s) 天然配合 string;而 cin.getline(buf, size) 是为 char buf[256] 设计的,容易缓冲区溢出,且不兼容 string 接口。
- 除非对接 C API 或嵌入式环境限制内存,否则别用
char[]接用户输入 -
string的capacity()和size()不同:前者是已分配空间,后者是当前字符数;getline()会自动扩容,不用预估长度 - 如果真要限制输入长度,得自己检查
s.length(),getline()本身不提供最大长度参数(除了istream::getline那个 C 风格重载)










