C++ 标准输入流 cin 完整教程

一、基础概念

cin标准输入流对象,定义在头文件 <iostream>,属于命名空间 std
作用:从控制台读取用户输入(键盘),对应输出流 cout

#include <iostream>
using namespace std; // 简化,不用写std::cin
int main() {
    int a;
    cin >> a; // 读取整数
    return 0;
}

不使用 using namespace std 写法:

std::cin >> a;

二、>> 提取运算符(最常用)

1. 读取基础类型

自动跳过空白:空格、换行、Tab

int n;
double d;
char ch;
string s;

cin >> n;
cin >> d >> ch >> s; // 连续读取

输入示例:10 3.14 a hello,四个变量一次性读入。

2. 读取字符串缺陷

cin >> s 遇到空格直接停止,无法读取带空格句子:
输入 hello world,s 只会得到 hello
解决:getline(cin, s)

三、getline 读取整行(含空格)

#include <iostream>
#include <string> // string必须包含
using namespace std;

int main() {
    string line;
    getline(cin, line);
    cout << line;
    return 0;
}

坑:混用 cin >> 和 getline 换行残留

int age;
cin >> age; // 读完数字后,缓冲区残留回车'\n'
string name;
getline(cin, name); // 直接读到空字符串!

修复:清空缓冲区换行

cin >> age;
cin.ignore(); // 丢弃缓冲区一个字符(换行)
getline(cin, name);

四、cin 常用成员函数

1. cin.get()

  1. cin.get():读取任意单个字符,包括空格、换行
char c = cin.get();
  1. cin.get(char数组, 长度):读取一行到 char 数组,不读空格
char buf[100];
cin.get(buf, 100);

2. cin.ignore(n, delim)

忽略缓冲区字符,常用清空换行:

cin.ignore(1000, '\n'); // 忽略最多1000字符,直到遇到换行

3. cin.peek()

偷看缓冲区下一个字符,但不取走:

if (cin.peek() == '\n') {
    cin.ignore();
}

4. cin.clear() / cin.fail()

输入错误状态处理:
当输入类型不匹配(如给int输入字母),cin会进入失败状态,后续读取全部失效。

int x;
cin >> x;
if (cin.fail()) {
    cout << "输入错误";
    cin.clear(); // 清除错误标记
    cin.ignore(1000, '\n'); // 清空错误缓冲区
}

5. cin.eof()

判断是否读到文件/输入末尾(Windows:Ctrl+Z,Linux/Mac:Ctrl+D)。

五、cin 循环读取(未知输入数量)

cin >> 变量 本身返回 cin 对象,可作为布尔判断:

int num;
while (cin >> num) {
    cout << num << " ";
}

逻辑:输入合法则循环,输入非数字/EOF自动退出。

六、关闭同步,加速cin(大数据输入)

C++ 默认和C stdio同步,速度慢,刷题常用优化:

ios::sync_with_stdio(false);
cin.tie(nullptr);

放在 main 开头,大幅提升读取速度。

七、cin 状态标志汇总

函数 作用
cin.good() 正常无错误
cin.fail() 类型匹配失败
cin.bad() 严重IO损坏
cin.eof() 读到末尾

八、完整示例代码

#include <iostream>
#include <string>
using namespace std;

int main() {
    // 加速cin
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int age;
    cout << "输入年龄:";
    cin >> age;
    cin.ignore(); // 清理换行

    string name;
    cout << "输入姓名(可带空格):";
    getline(cin, name);

    cout << "姓名:" << name << ",年龄:" << age << endl;
    return 0;
}

九、关键总结

  1. cin >>:自动跳过空白,不能读带空格字符串;
  2. getline(cin, string):读取整行,包含空格;
  3. cin >> 后用 getline 必须 ignore() 清换行;
  4. 输入非法会触发 failbit,需要 clear() + ignore() 重置;
  5. 大数据输入加两行代码提速。

更多推荐