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

前置准备

头文件必须包含:

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

方法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 会直接读到空字符串。

错误示例
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;
}

更多推荐