如何使用C++标准输入流cin读取字符串?
·
C++ cin 读取字符串三种完整方式、区别、踩坑解决
前置准备
头文件必须包含:
#include <iostream>
#include <string> // 使用std::string必备
using namespace std;
方法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 会直接读到空字符串。
错误示例
int num;
cin >> num;
string s;
getline(cin, s); // 直接读取空,跳过输入
解决方案:cin.ignore() 清空残留换行
int num;
cin >> num;
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 清空整行剩余字符
string s;
getline(cin, s);
需要额外头文件:
#include <limits>
方法3:C风格字符数组读取(char[])
3.1 cin >> char[](同样截断空格)
char buf[100];
cin >> buf;
3.2 cin.getline(char数组, 长度) 读带空格字符串
char buf[100];
// 最多读取99个字符,末尾自动补'\0'
cin.getline(buf, sizeof(buf));
方法4:cin.get() 逐字符读取字符串(进阶)
循环读取单个字符,手动拼接,可完全自定义终止条件:
string s;
char ch;
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>
using namespace std;
int main() {
int age;
cin >> age;
cin.ignore(numeric_limits<streamsize>::max(), '\n');
string name;
getline(cin, name);
cout << age << " " << name;
return 0;
}
模板3:连续读取多行文本
string s;
while (getline(cin, s)) {
cout << s << endl;
}
更多推荐
所有评论(0)