在C++里处理用户输入时,经常会碰到需要读取一整行且其中包含空格的情况。如果使用cin直接读取string,输入流会在第一个空格处截断,导致后面的内容丢失。这时就应该使用getline函数,它能从输入流中一直读到换行符为止,把整行内容存进字符串。

为什么cin读不了带空格的字符串
cin在读取string类型时,默认以空白字符(空格、制表符、换行符)作为分隔符。例如用户输入"hello world",cin只会拿到"hello",剩下的"world"还留在输入缓冲区里。
getline的基本用法
getline有两个常用形式,最典型的是接收输入流和string对象:
#include <iostream>
#include <string>
using namespace std;
int main() {
string line;
// 从标准输入读取一整行,包含空格
getline(cin, line);
cout << "你输入的是: " << line << endl;
return 0;
}
上面代码中,用户输入"今天 天气 不错",程序也会原样输出整行内容。
cin和getline混用的坑
如果在cin读取数字或单词之后立刻用getline,经常会读到一个空行。原因是cin离开时把换行符留在了缓冲区,getline一上来就遇到了换行符直接返回。
解决办法是在cin后面加一句cin.ignore()清掉换行符:
#include <iostream>
#include <string>
using namespace std;
int main() {
int age;
string name;
cin >> age;
cin.ignore(); // 丢弃缓冲区里的换行符
getline(cin, name);
cout << age << " " << name << endl;
return 0;
}
带分隔符的getline
getline还支持第三个参数,指定换行以外的分隔符,比如按逗号切分:
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main() {
string data = "a,b,c";
stringstream ss(data);
string item;
while (getline(ss, item, ',')) {
cout << item << endl;
}
return 0;
}
小结
用getline(cin, str)可以轻松读取带空格的整行字符串。记住cin之后要用cin.ignore()避免空行问题,就能在C++里稳妥地处理各种文本输入了。