应使用std::getline()读取含空格的整行字符串;cin>>会以空白符截断,而std::getline()保留空格、自动管理内存,需注意前序输入残留换行符时要先用cin.ignore()清理。

cin >> 会截断空格,必须换方法
cin >> 默认以空白字符(空格、制表符、换行)为分隔符,读到第一个空格就停了,根本拿不到完整字符串。比如输入 "hello world",cin >> str 只存下 "hello",后面全丢掉。
真正要读带空格的一整行,得用 std::getline() —— 它按换行符切,中间的空格全保留。
- 必须搭配
std::string使用(最安全),不推荐直接读进 C 风格字符数组(容易溢出) - 如果非要用字符数组,得用
cin.getline(),且必须显式指定缓冲区大小 - 注意:前面如果有残留的换行符(比如之前用了
cin >>),getline()会立刻读到空行,得先调cin.ignore()清掉
用 std::getline 读整行到 string(推荐)
这是现代 C++ 的标准做法,自动管理内存,不会越界:
std::string line; std::getline(std::cin, line);
输入 "C++ is fun",line 就是完整字符串。如果后续还要读数字或其它类型,记得检查 line.empty() 或用 std::stringstream 解析。
立即学习“C++免费学习笔记(深入)”;
-
std::getline()第二个参数是目标std::string,不是长度 - 它会吃掉结尾的换行符,但不把它存进
string - 如果输入流出错(如 EOF),
line保持原值,需用cin.fail()判断
用 cin.getline() 读进 char 数组(慎用)
如果你坚持用 char buf[100] 这种方式,必须写成:
char buf[100]; std::cin.getline(buf, sizeof(buf));
sizeof(buf) 是硬性要求——第二个参数是“最多读几个字符(含结尾 \0)”,传错会导致缓冲区溢出或截断。
- 如果输入超过 99 个字符,
cin.getline()会设failbit,后续所有输入操作都失败,得调cin.clear()恢复 -
cin.getline()和std::getline()行为不同:前者只认\n,后者可指定分隔符 - 别混用
cin >>和cin.getline(),中间不清理缓存会跳过第一行
常见坑:混合输入后 getline 读不到内容
典型场景:先读一个整数,再用 getline() 读名字:
int age; std::cin >> age; std::string name; std::getline(std::cin, name); // 这里 name 是空字符串!
因为 cin >> 留下了换行符在输入缓冲区,getline() 立刻遇到它就返回了。
- 解决方法:在
getline()前加std::cin.ignore(1, '\n');或更稳妥的std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); - 或者统一全用
getline()+std::stoi()解析数字,避免混用 - 别依赖
fflush(stdin)—— 它在 C++ 标准里未定义,VS 里能用,Linux/GCC 直接忽略
std::string),就老实用 std::getline(std::cin, str)。字符数组那套手动管理长度和边界的方式,一不留神就崩,而且毫无必要。


















