目录
四、cin/cout与 C 语言的scanf/printf对比
在 C++ 中,cin和cout是标准输入输出流对象,用于从标准设备(通常是键盘)读取数据和向标准设备(通常是屏幕)输出数据,它们属于 C++ 标准库的<iostream>组件。下面详细讲解它们的用法。
一、基础准备:头文件与命名空间
使用cin和cout前,必须包含头文件<iostream>,且它们属于std命名空间,因此需要通过以下方式访问:
#include <iostream> // 必须包含的头文件
using namespace std; // 简化访问(可选,也可使用std::前缀)
如果不使用using namespace std,则需在cin/cout前加std::,例如std::cout << "Hello";。
二、cout:标准输出流
cout(全称 “character output”)用于向标准输出设备(屏幕)输出数据,核心操作符是<<(插入运算符)。
1. 基本用法
- 输出常量、变量或表达式,多个输出项用
<<连接。 - 支持多种数据类型:整数、浮点数、字符、字符串等。
示例:
#include <iostream>
using namespace std;
int main() {
int a = 10;
double b = 3.14;
char c = 'A';
string s = "Hello"; // 需包含<string>头文件
// 输出常量
cout << "Hello World!" << endl; // endl:换行并刷新缓冲区
// 输出变量和表达式
cout << "a = " << a << ", b = " << b << ", c = " << c << endl;
cout << "a + 5 = " << (a + 5) << ", b * 2 = " << (b * 2) << '\n'; // '\n'仅换行
return 0;
}
输出结果:
Hello World!
a = 10, b = 3.14, c = A
a + 5 = 15, b * 2 = 6.28
2. 换行与刷新:endl vs '\n'
endl:作用是 “换行 + 刷新输出缓冲区”(确保数据立即显示),但频繁使用可能降低效率。'\n':仅表示换行,不刷新缓冲区,效率更高,推荐日常使用。
3. 格式控制(需包含<iomanip>头文件)
通过操纵符(manipulator)控制输出格式(如宽度、精度、对齐方式等),常用操纵符:
| 操纵符 | 作用 | 示例 | 输出结果 |
|---|---|---|---|
setw(n) | 设置输出宽度(仅对下一个输出项有效) | cout << setw(5) << "a"; | a(右对齐,宽度 5) |
left/right | 左对齐 / 右对齐(默认右对齐) | cout << left << setw(5) << "a"; | a |
setfill(c) | 设置填充字符(配合setw使用) | cout << setw(5) << setfill('*') << "a"; | ****a |
setprecision(n) | 控制浮点数精度(默认是有效数字) | cout << setprecision(3) << 3.1415; | 3.14 |
fixed | 配合setprecision输出固定小数位数 | cout << fixed << setprecision(2) << 3.1415; | 3.14 |
hex/dec/oct | 以十六进制 / 十进制 / 八进制输出整数 | cout << hex << 255; | ff |
示例(格式控制):
#include <iostream>
#include <iomanip> // 格式控制需包含此头文件
using namespace std;
int main() {
double pi = 3.1415926535;
// 固定2位小数
cout << "pi(2位小数):" << fixed << setprecision(2) << pi << endl;
// 输出宽度10,左对齐,填充'#'
cout << "左对齐:" << left << setw(10) << setfill('#') << "test" << endl;
// 十六进制输出整数
cout << "255的十六进制:" << hex << 255 << endl;
return 0;
}
输出结果:
pi(2位小数):3.14
左对齐:test######
255的十六进制:ff
三、cin:标准输入流
cin(全称 “character input”)用于从标准输入设备(键盘)读取数据,核心操作符是>>(提取运算符)。
1. 基本用法
- 从输入流中读取数据,存储到变量中,多个变量用
>>连接。 - 自动跳过空白字符(空格、回车、制表符
\t等),直到读取到有效数据。
示例:
#include <iostream>
using namespace std;
int main() {
int a;
double b;
char c;
string s; // 需包含<string>头文件
cout << "输入整数、浮点数、字符、字符串(空格分隔):";
cin >> a >> b >> c >> s; // 依次读取到变量中
cout << "你输入的是:" << endl;
cout << "整数:" << a << endl;
cout << "浮点数:" << b << endl;
cout << "字符:" << c << endl;
cout << "字符串:" << s << endl;
return 0;
}
输入示例(输入后回车):
输入整数、浮点数、字符、字符串(空格分隔):10 3.14 A hello
输出结果:
你输入的是:
整数:10
浮点数:3.14
字符:A
字符串:hello
2. 读取一行数据(含空格)
cin >> 变量读取字符串时,会在空格处停止(仅读取第一个空格前的内容)。若需读取含空格的一行,需用以下函数:
cin.getline(字符数组, 最大长度):读取一行到字符数组(自动丢弃换行符)。getline(cin, 字符串变量):读取一行到string对象(需包含<string>,自动丢弃换行符)。
示例(读取含空格的一行):
#include <iostream>
#include <string> // 需包含<string>
using namespace std;
int main() {
char buf[100]; // 字符数组
string str; // string对象
cout << "输入一行话(用字符数组接收):";
cin.getline(buf, 100); // 最多读99个字符(留1个给'\0')
cout << "输入一行话(用string接收):";
getline(cin, str);
cout << "字符数组接收:" << buf << endl;
cout << "string接收:" << str << endl;
return 0;
}
输入示例:
输入一行话(用字符数组接收):I love C++
输入一行话(用string接收):Hello World
输出结果
字符数组接收:I love C++
string接收:Hello World
3. 输入错误处理
当输入的数据类型与变量类型不匹配时(例如:给int变量输入字符串),cin会进入错误状态,后续输入会失效。需通过以下方法恢复:
cin.clear():清除错误状态,恢复cin的输入功能。cin.ignore(n, 终止符):忽略缓冲区中剩余的n个字符(或直到遇到终止符),避免错误数据影响后续输入。
示例(处理输入错误):
#include <iostream>
#include <limits> // 用于numeric_limits
using namespace std;
int main() {
int num;
cout << "输入一个整数:";
cin >> num;
// 判断输入是否失败
if (cin.fail()) {
cout << "输入错误!请重新输入整数:";
cin.clear(); // 清除错误状态
// 忽略缓冲区中所有剩余字符(直到换行)
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cin >> num; // 重新读取
}
cout << "你输入的整数是:" << num << endl;
return 0;
}
输入错误示例(先输入字符串,再输入整数):
输入一个整数:abc
输入错误!请重新输入整数:123
你输入的整数是:123
四、cin/cout与 C 语言的scanf/printf对比
| 特性 | cin/cout(C++) | scanf/printf(C) |
|---|---|---|
| 类型安全 | 是(编译时检查类型匹配) | 否(需手动指定格式符,易出错) |
| 使用复杂度 | 简单(无需格式符) | 复杂(需记忆格式符,如%d、%f) |
| 效率 | 略低(默认带缓冲区同步) | 略高 |
| 灵活性 | 高(支持自定义类型重载) | 低(仅支持基本类型) |
注意:若需提升cin/cout效率,可关闭缓冲区同步(通常用于竞赛):
ios::sync_with_stdio(false); // 关闭与stdio的同步,加快速度
cin.tie(0); // 解除cin与cout的绑定,进一步提速
总结
cout用于输出,通过<<连接数据,支持格式控制(需<iomanip>)。cin用于输入,通过>>读取数据,读取含空格的行需用getline或cin.getline。- 输入错误时需用
cin.clear()和cin.ignore()恢复。 cin/cout类型安全、使用简单,是 C++ 推荐的输入输出方式。
5万+

被折叠的 条评论
为什么被折叠?



