cin>>会截断空格,应改用cin.getline()读整行;cin.getline(arr,size)最多读size-1字符并自动加'\0';混用>>和getline需用ignore清缓冲区残留换行符。

cin >> 会截断空格,必须换函数
cin >> 遇到空格、制表符或换行就停,根本读不完带空格的字符串。比如输入 "Hello World",cin >> arr 只存进 "Hello",后面全丢。这不是 bug,是设计行为——它按“单词”分割输入。
真正该用的是 cin.getline() 或 cin.get(),它们能读整行(含空格),直到遇到换行符才停。
cin.getline() 是最常用的安全选择
它明确要求指定缓冲区大小,天然防溢出,比裸用 gets()(已废弃)或不设限的 cin >> 安全得多。
-
cin.getline(arr, size):读最多size - 1个字符,自动在末尾加'\0' - 如果输入超长,剩余字符(含换行)留在输入缓冲区,下次读取可能出问题
- 必须确保
arr是char[]数组,不能是std::string(那是std::getline()的事)
char name[50]; cin.getline(name, sizeof(name)); // 安全:最多读49字节 + '\0'
cin.get() 能读单个字符,也能读整行但行为不同
cin.get() 有两个常用重载:一个读单字符(含空格),一个读整行但不丢弃换行符。
-
cin.get(arr, size)和getline()类似,但**不跳过开头的换行符**,也不自动丢弃换行符——它把换行符当普通字符读进数组(如果空间够) - 更常见的是先用
cin.get()吃掉残留换行符,再用getline(),避免因上一次输入留下的\n导致getline()立即返回空串
int age; cin >> age; // 输入 25 后回车,缓冲区剩 \n cin.get(); // 吃掉这个 \n cin.getline(name, 50); // 才能正常读下一行
别混用 >> 和 getline(),缓冲区残留是最大坑
这是新手最常踩的坑:先用 cin >> x 读数字或单词,紧接着 cin.getline(y, N) 却读到空串。原因就是 >> 没吃掉结尾的换行符,getline() 一看到 \n 就立刻结束。
- 每次在
>>后接getline()前,务必清缓冲区 - 推荐写法:
cin.ignore(1, '\n')(忽略最多 1 个字符,直到遇到\n)或cin.ignore(numeric_limits<streamsize>::max(), '\n')</streamsize>(清空整行) - 数组大小写错、越界访问、忘记预留
\0空间,都会导致未定义行为
安全不是靠记住规则,而是每次分配数组时心里算清楚:49 字节内容 + 1 字节 '\0',然后 sizeof(arr) 必须和 getline() 第二个参数一致——差 1 都可能崩。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











