当前位置: 首页 > backend >正文

【C++】控制台输入与输出

目录

  • 🚀前言
  • 🌟C++控制台输入输出基础
    • 💯输入:cin的基本用法
    • 💯输出:cout与换行/刷新
  • 🗡️格式化输出的“武器库”
    • 💯进制格式化
    • 💯浮点数精度控制
    • 💯域宽控制
    • 💯对齐方式
    • 💯填充字符
    • 💯格式标志的重置
    • 💯格式化函数作用域总结
  • ☘️总结

🚀前言

在这里插入图片描述

大家好!我是 EnigmaCoder

  • 在C++开发中,控制台输出(cout)是我们与程序交互、查看数据的最直接方式。但默认的输出格式往往不够“美观”或“精准”——比如浮点数显示过多小数位、数值对齐杂乱、进制展示不直观等。今天,我们就来系统学习C++的格式化输出,让cout也能“花式输出”数据~

🌟C++控制台输入输出基础

💯输入:cin的基本用法

cin是C++标准输入流,用于从控制台读取数据。它默认以空白、回车、TAB作为数据的分隔符。

  • 单个变量输入:

    int c1, c2;
    cin >> c1;  // 读取第一个整数到c1
    cin >> c2;  // 读取第二个整数到c2
    
  • 多个变量连续输入:

    string name;
    int age;
    cin >> name >> age;  // 依次读取字符串(姓名)和整数(年龄)
    

💯输出:cout与换行/刷新

cout是C++标准输出流,用于向控制台打印数据。控制换行的常用方式有两种:

  • '\n'仅实现换行,不会刷新输出缓冲区。
  • endl换行 + 刷新输出缓冲区(等价于 '\n' + flush),适合需要立即看到输出的场景。

示例:

cout << "这是第一行\n";  // 仅换行
cout << "这是第二行" << endl;  // 换行并刷新缓冲区

🗡️格式化输出的“武器库”

要实现进制转换、精度控制、对齐方式、填充字符等高级格式化效果,需要引入头文件 <iomanip>(“input/output manipulation”的缩写)。它提供了一系列“控制符”,让我们能精细调控cout的输出格式。

同时,为了简化代码,我们通常会使用 using namespace std;,避免重复写std::前缀。

💯进制格式化

在C++中,整数可以用八进制、十进制、十六进制展示,分别由 octdechex 控制。这三个控制符属于**“持续生效”型**:设置后,后续所有整数输出都会遵循该进制,直到被其他进制控制符覆盖。

  1. 示例代码
int a = 10;
cout << "a的八进制数是:" << oct << a << endl;
cout << "a的十进制数是:" << dec << a << endl;
cout << "a的十六进制数是:" << hex << a << endl;
  1. 输出结果
a的八进制数是:12
a的十进制数是:10
a的十六进制数是:a
  1. 进制控制对比表
控制符作用示例(a=10
oct设置为八进制输出12
dec设置为十进制输出(默认)10
hex设置为十六进制输出a

💯浮点数精度控制

浮点数(double/float)的“精度”是格式化输出的重点。setprecision(n) 的行为会因是否结合 fixed 而不同。

  1. fixed:控制“有效数字总位数”

当没有 fixed 时,setprecision(n) 表示“从第一个非零数字开始,保留 n 位有效数字”(整数部分 + 小数部分的总有效位数)。

示例:

double pi = 3.1415926;
cout << setprecision(4) << pi << endl;

输出:3.142(有效数字:3142,共4位)

  1. fixed模式:控制“小数位数”

当使用 fixed 时,setprecision(n) 表示“强制保留 n 位小数”(整数部分正常显示,小数部分补0或截断)。

示例:

double pi = 3.1415926;
cout << fixed << setprecision(4) << pi << endl;

输出:3.1416(小数部分保留4位,自动四舍五入)

  1. 精度控制对比表
模式setprecision(n) 作用示例(pi=3.1415926, n=4
fixed有效数字总位数为n3.142
fixed小数部分位数为n3.1416

💯域宽控制

setw(n) 用于指定下一个输出项的宽度(单位:字符数)。需要注意:它是**“一次性”生效**的——只影响紧接着的一个输出项,后续输出需重新调用 setw 才会生效。

默认情况下,内容右对齐,多余宽度用“空格”填充在左侧。

示例:

cout << setw(10) << "hello" << endl;

输出(左侧补5个空格,总宽度10):

     hello

💯对齐方式

<iomanip> 通过 setiosflags 结合 ios 命名空间下的枚举(left/right/internal),控制输出的对齐方式。这些对齐标志属于**“持续生效”型**,直到被 resetiosflags 清除或被其他对齐标志覆盖。

  1. ios::left:左对齐

内容靠左,多余宽度的填充字符在右侧

示例:

cout << setiosflags(ios::left) << setw(10) << "hello" << endl;

输出(右侧补5个空格,总宽度10):

hello     
  1. ios::right:右对齐(默认)

内容靠右,多余宽度的填充字符在左侧

示例:

cout << setiosflags(ios::right) << setw(10) << "hello" << endl;

输出(左侧补5个空格,总宽度10):

     hello
  1. ios::internal:“内部”对齐(数值专属)
  • 数值类型(如 int/double 等):填充字符会插入到“符号(+/-)或基数(如十六进制的0x)”与“数值主体”之间。
  • 非数值类型(如字符串、字符):效果等同于 ios::right(右对齐,左侧填充)。

示例(数值类型):

cout << setiosflags(ios::internal) << setw(10) << setfill('#') << -123 << endl;

输出(符号-后补6个#,再跟数值123,总宽度10):

-######123

示例(非数值类型):

cout << setiosflags(ios::internal) << setw(10) << "hello" << endl;

输出(效果同right,左侧补5个空格,总宽度10):

     hello
  1. 对齐方式对比表
对齐标志作用范围填充字符位置示例(内容"hello",宽度10)
ios::left所有类型内容右侧hello
ios::right所有类型内容左侧(默认) hello
ios::internal数值类型专属;非数值等价于right符号/基数与数值之间(数值);内容左侧(非数值)数值:-######123;字符串: hello

💯填充字符

默认情况下,setw 的多余宽度用“空格”填充。通过 setfill(c) 可以指定自定义填充字符(如*#等),且该设置持续有效,直到被新的 setfill 调用覆盖。

示例:

cout << setfill('*') << setw(15) << "hello" << endl;  // 用`*`填充
cout << setfill(' ') << setw(15) << "hello" << endl;  // 还原为空格填充

输出:

**********hellohello

💯格式标志的重置

当我们想清除之前用 setiosflags 设置的对齐标志(如 left/right/internal),回到默认状态时,需要用 resetiosflags,并传入要清除的标志(多个标志用|分隔)。

示例:

// 先设置`left`,再重置所有对齐标志
cout << setiosflags(ios::left) << setw(10) << "hello" << endl;
cout << resetiosflags(ios::left | ios::right | ios::internal) << setw(10) << "hello" << endl;

输出(第一行左对齐,第二行回到默认右对齐):

hello     hello

💯格式化函数作用域总结

为了更清晰地记忆各格式化工具的“生效范围”,我们整理成表格:

格式化工具作用域特点示例/说明
oct/dec/hex持续有效,直到被覆盖设置hex后,所有后续整数都以十六进制输出,直到用dec/oct切换。
setprecision持续有效,直到被修改结合fixed时控制小数位;无fixed时控制有效数字,直到新的setprecision或格式标志改变。
setw仅对下一个输出项有效setw(10) << "a" 只影响"a"的宽度,下一个输出需重新调用setw
setiosflags(对齐等)持续有效,直到被重置/覆盖设置ios::left后,所有后续输出都左对齐,直到用resetiosflagsios::right等覆盖。
setfill持续有效,直到被修改设置setfill('*')后,所有setw的填充字符都是*,直到新的setfill调用。

☘️总结

C++的格式化输出看似繁琐,实则有清晰的规律:

  • 区分“持续生效”和“一次性生效”的工具(如setw是一次性,oct/setfill是持续);
  • 浮点数精度要关注fixed的有无;
  • 对齐方式中ios::internal是数值专属的“特殊对齐”;
  • 善用resetiosflags清除不需要的格式标志。
  • 掌握这些技巧后,你就能让cout输出既“精准”又“美观”,无论是调试程序还是展示数据,都能更加得心应手。
  • 本文代码在VSCode、Dev-C++等支持C++11及以上的环境均可运行,记得包含<iostream><iomanip>头文件。
http://www.xdnf.cn/news/19864.html

相关文章:

  • 机器学习实战:逻辑回归算法深度解析与案例应用
  • Win64OpenSSL-3_5_2.exe【安装步骤】
  • ABAP BAPI_CONTRACT_CREATE 报错 06 658
  • 【FastDDS】Layer DDS之Core (详解)
  • pytorch gpu版本安装(最新保姆级安装教程)
  • Masonry
  • 从全栈开发到微服务架构:一位Java工程师的实战经验分享
  • el-dialog 打开dialog弹框,鼠标点击事件无法执行
  • [TryHackMe]Oh My WebServer(nday漏洞+容器逃逸)
  • Teacher Forcing技术解析
  • 解构复杂财务逆向业务:如何优雅地生成与管理负数单?
  • c++ zint二维码、条形码开发库
  • k8s初始化常见问题
  • 笔记:深层卷积神经网络(CNN)中的有效感受野简单推导
  • 行业分享丨基于SimSolid的大型汽车连续冲压模具刚度分析
  • vue3前端开发的基础教程——快速上手
  • flutter 中间组件自适应宽度
  • 硬件:51单片机的按键、中断、定时器、PWM及蜂鸣器
  • 深入解析MongoDB内部架构设计
  • 深度学习-----简单入门卷积神经网络CNN的全流程
  • 做 DevOps 还在被动救火?这篇让你把监控玩成 “运维加速器”!
  • 【CV】OpenCV基本操作④——算术操作
  • OpenGL视图变换矩阵详解:从理论推导到实战应用
  • 《四川棒球知识百科》球速最快的运动之一·棒球1号位
  • Grok-4 :AI 基准测试霸主,速度与智能并存——但代价几何?
  • 学习 Android (十九) 学习 OpenCV (四)
  • sql项目总结
  • 无人机报警器8G信号技术解析
  • npm install 报错问题解决 npm install --ignore-scripts
  • 嵌入式学习---(单片机)