在C++的输入操作中,使用cin直接读取字符串时,默认会以空格、制表符、换行符作为分隔符,遇到空格就会停止读取,无法获取包含空格的完整字符串。std::getline作为标准库提供的行读取函数,能够读取一整行内容,包括其中的空格,是处理带空格字符串输入的核心工具。

std::getline基本用法
std::getline定义在<string>头文件中,最常用的两个参数版本原型如下:
#include <iostream> #include <string> using namespace std; // 函数原型:istream& getline (istream& is, string& str); // is是输入流对象,str是存储读取结果的字符串对象 // 返回值是输入流对象,支持链式调用
基础使用示例:
#include <iostream>
#include <string>
using namespace std;
int main() {
string content;
cout << "请输入带空格的字符串:" << endl;
// 读取整行输入,包含空格
getline(cin, content);
cout << "你输入的内容是:" << content << endl;
return 0;
}
运行上述代码,输入hello world cpp,输出会完整显示整个输入内容,不会在空格处截断。
与cin配合使用的注意事项
如果在使用cin读取其他类型数据后使用std::getline,可能会遇到读取到空字符串的问题,这是因为cin读取后会留下换行符在输入缓冲区,getline会直接读取这个换行符作为一行内容。
错误示例:
#include <iostream>
#include <string>
using namespace std;
int main() {
int num;
string str;
cout << "请输入一个数字:" << endl;
cin >> num;
cout << "请输入带空格的字符串:" << endl;
// 此时输入缓冲区还残留换行符,getline会直接读取换行符,str为空
getline(cin, str);
cout << "数字:" << num << ",字符串:" << str << endl;
return 0;
}
解决方法是在cin之后清空输入缓冲区的残留换行符,有两种常用方式:
方式1:使用cin.ignore()
#include <iostream>
#include <string>
#include <limits>
using namespace std;
int main() {
int num;
string str;
cout << "请输入一个数字:" << endl;
cin >> num;
// 忽略输入缓冲区中所有字符直到遇到换行符
cin.ignore(numeric_limits<streamsize>::max(), 'n');
cout << "请输入带空格的字符串:" << endl;
getline(cin, str);
cout << "数字:" << num << ",字符串:" << str << endl;
return 0;
}
方式2:使用额外的getline读取残留换行符
#include <iostream>
#include <string>
using namespace std;
int main() {
int num;
string str;
string temp; // 临时存储残留换行符
cout << "请输入一个数字:" << endl;
cin >> num;
getline(cin, temp); // 读取cin留下的换行符
cout << "请输入带空格的字符串:" << endl;
getline(cin, str);
cout << "数字:" << num << ",字符串:" << str << endl;
return 0;
}
指定分隔符的getline用法
std::getline还支持第三个参数,用于指定行分隔符,默认是换行符,也可以自定义其他字符作为分隔符。
#include <iostream>
#include <string>
using namespace std;
int main() {
string str;
cout << "请输入内容,以#作为结束符:" << endl;
// 指定#作为分隔符,读取到#为止的内容
getline(cin, str, '#');
cout << "读取到的内容:" << str << endl;
return 0;
}
输入hello world#test,程序会读取到hello world,遇到#就停止读取。
常见使用场景总结
- 需要读取用户输入的包含空格的整行内容,比如姓名、地址、描述信息等
- 需要按自定义分隔符读取字符串片段
- 处理文件读取时,按行读取文件内容
使用时需要注意输入缓冲区的残留字符问题,避免出现读取到空字符串的情况。如果是连续使用getline读取多行,不需要额外处理缓冲区,因为getline读取完一行后会消耗掉换行符,下一次调用会正常读取下一行内容。
std::getlineC++字符串输入cin空格处理修改时间:2026-07-01 01:57:20