C++ 标准输入流 cin 完整教程
·
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()
cin.get():读取任意单个字符,包括空格、换行
char c = cin.get();
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;
}
九、关键总结
cin >>:自动跳过空白,不能读带空格字符串;getline(cin, string):读取整行,包含空格;cin >>后用getline必须ignore()清换行;- 输入非法会触发 failbit,需要
clear()+ignore()重置; - 大数据输入加两行代码提速。
更多推荐
所有评论(0)