如何使用C++标准输入流cin读取字符串?
📅 2026/7/2 12:07:51
👁️ 阅读次数
📝 编程学习
C++ cin 读取字符串三种完整方式、区别、踩坑解决
前置准备
头文件必须包含:
#include<iostream>#include<string>// 使用std::string必备usingnamespacestd;方法1:cin >> 字符串变量(最简单,不能读空格)
原理
提取运算符>>自动跳过开头空白(空格、回车、Tab),读到下一个空白字符立刻停止。
示例
string s;cout<<"输入单词:";cin>>s;cout<<s<<endl;输入:Hello World
输出:Hello,World留在缓冲区未读取。
适用场景
只读取不含空格的单词、账号、编号等短文本。
方法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;}
编程学习
技术分享
实战经验