如何使用C++标准输入流cin读取字符串?

C++ cin 读取字符串三种完整方式、区别、踩坑解决

前置准备

头文件必须包含:

#include<iostream>#include<string>// 使用std::string必备usingnamespacestd;

方法1:cin >> 字符串变量(最简单,不能读空格

原理

提取运算符>>自动跳过开头空白(空格、回车、Tab),读到下一个空白字符立刻停止

示例

string s;cout<<"输入单词:";cin>>s;cout<<s<<endl;

输入:Hello World
输出:HelloWorld留在缓冲区未读取。

适用场景

只读取不含空格的单词、账号、编号等短文本。

方法2:getline(cin, string)读取整行(包含空格)

原理

读取缓冲区所有字符,直到遇到换行符\n;换行符丢弃,不会存入字符串。

基础示例

string s;cout<<"输入一句话:";getline(cin,s);cout<<s<<endl;

输入:I love C++,完整输出整行。

重大坑:cin >>getline混用空行问题

执行cin >> num输入数字按下回车后,换行符残留在输入缓冲区,下一次getline会直接读到空字符串。

错误示例
intnum;cin>>num;string s;getline(cin,s);// 直接读取空,跳过输入
解决方案:cin.ignore()清空残留换行
intnum;cin>>num;cin.ignore(numeric_limits<streamsize>::max(),'\n');// 清空整行剩余字符string s;getline(cin,s);

需要额外头文件:

#include<limits>

方法3:C风格字符数组读取(char[])

3.1 cin >> char[](同样截断空格)

charbuf[100];cin>>buf;

3.2 cin.getline(char数组, 长度) 读带空格字符串

charbuf[100];// 最多读取99个字符,末尾自动补'\0'cin.getline(buf,sizeof(buf));

方法4:cin.get() 逐字符读取字符串(进阶)

循环读取单个字符,手动拼接,可完全自定义终止条件:

string s;charch;while((ch=cin.get())!='\n'){s+=ch;}cout<<s;

四种读取方式对比

方式是否支持空格终止条件适用场景
cin >> string❌ 不支持空格/回车无空格短字符
getline(cin, str)✅ 支持整行换行符句子、带空格文本
cin.getline(char[], N)✅ 支持整行换行/长度上限C语言字符数组
cin.get()循环拼接✅ 完全自定义自己设定结束符精细控制输入

常用实操模板

模板1:单纯读取带空格一行

string line;getline(cin,line);

模板2:先读数字,再读取带空格句子(无空行bug)

#include<iostream>#include<string>#include<limits>usingnamespacestd;intmain(){intage;cin>>age;cin.ignore(numeric_limits<streamsize>::max(),'\n');string name;getline(cin,name);cout<<age<<" "<<name;return0;}

模板3:连续读取多行文本

string s;while(getline(cin,s)){cout<<s<<endl;}