c++中cin和cout标准输入输出流用法详解

目录

一、基础准备:头文件与命名空间

二、cout:标准输出流

1. 基本用法

2. 换行与刷新:endl vs '\n'

3. 格式控制(需包含 头文件)

三、cin:标准输入流

1. 基本用法

2. 读取一行数据(含空格)

3. 输入错误处理

四、cin/cout与 C 语言的scanf/printf对比

总结


在 C++ 中,cincout是标准输入输出流对象,用于从标准设备(通常是键盘)读取数据和向标准设备(通常是屏幕)输出数据,它们属于 C++ 标准库的<iostream>组件。下面详细讲解它们的用法。

一、基础准备:头文件与命名空间

使用cincout前,必须包含头文件<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用于输入,通过>>读取数据,读取含空格的行需用getlinecin.getline
  • 输入错误时需用cin.clear()cin.ignore()恢复。
  • cin/cout类型安全、使用简单,是 C++ 推荐的输入输出方式。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

start_up_go

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值