cin >> char[] 会触发缓冲区溢出,因其无长度检查,持续读取至空白符,易越界写入;应改用 cin.getline(buf, sizeof(buf)) 并配合 cin.ignore() 清理换行符,或直接使用 string + getline 安全读取。

cin >> char[] 为什么会触发缓冲区溢出
因为 cin >> 对 char[] 没有长度检查,它会一直读直到遇到空白符(空格、换行、制表符),而不管数组实际有多大。比如声明 char buf[5],用户输入 hello(5个字符+1个隐式 \0),就已越界写入第6个字节;若输 world!,溢出更严重。
用 cin.getline() 替代 cin >> char[]
这是最直接、安全的替代方案:显式指定最大读取长度,并自动补 \0,且丢弃超长部分后的剩余输入(包括换行符)。
使用要点:
-
cin.getline(buf, sizeof(buf))—— 第二个参数是缓冲区总字节数,不是“最多读几个字符”;它最多读sizeof(buf)-1个字符,留1字节给\0 - 如果用户输入超过容量,
cin.failbit不会置位,但后续cin操作可能因残留换行符异常;建议紧接cin.ignore()清理(见下一点) - 不能混用
cin >>和getline:前者留下换行符,后者会立即读到空行;中间务必调用cin.ignore()
cin.ignore() 清理输入缓冲区的必要场景
当在 cin >> 后立刻用 cin.getline(),或连续多次 getline() 出现跳过现象时,大概率是前一次输入留下的换行符没被消费。
立即学习“C++免费学习笔记(深入)”;
典型修复写法:
int x; cin >> x; // 输入 123↵,缓冲区剩 \n cin.ignore(); // 默认忽略1个字符(即 \n) cin.getline(buf, 100); // 正常等待用户输入
更健壮的写法(清空整行):
cin.ignore(numeric_limits<streamsize>::max(), '\n');
需要包含头文件 <limits> 和 <iostream>。
更现代的解法:直接用 std::string + getline
从根本上规避 C 风格数组的长度管理问题。C++ 标准库的 std::string 自动管理内存,std::getline() 与之配合无溢出风险。
示例:
string s; getline(cin, s); // 安全读整行,s 自动扩容
注意:getline(cin, s) 和 cin >> s 行为不同:>> 遇空格即停,getline 读到换行才停;且 getline 不会跳过开头空白,>> 会。
如果必须转成 C 风格字符串(如调用旧 API),用 s.c_str() 即可,但确保目标函数不修改内容(它是 const char*)。
真正容易被忽略的是:很多教程只教 cin.getline(),却没强调它和 cin >> 混用时的换行符陷阱——这个细节一错,整个输入逻辑就不可预测。


















