【C++】格式化输出详解:掌握 cout 的进阶用法

news2024/12/26 17:53:44

在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C++

文章目录

  • 💯前言
  • 💯格式化输出的理论概述
  • 💯控制输出宽度和填充字符
    • `setw` 操作符
    • `setfill` 操作符
  • 💯控制浮点数的显示格式
    • `fixed` 与 `scientific`
    • `setprecision`
  • 💯整数的进制表示控制
    • `dec`、`hex`、`oct`
  • 💯控制对齐方式
    • `left` 与 `right`
  • 💯结合操纵符的应用场景
    • 表格化输出
  • 💯小结


在这里插入图片描述


💯前言

  • 在编写 C++ 程序时,cout 是我们用来输出信息的基础工具。然而,仅仅使用 cout 进行简单的输出往往难以满足复杂应用场景的需求。我们需要深入掌握各种格式化输出的技巧,以便更精确地控制输出,适应各类场合的需求。在本文中,我们将系统性地探讨如何使用 C++ 提供的 <iomanip> 头文件及相关操纵符来灵活控制输出格式,包括对齐方式数值表示方式宽度管理等方面,帮助你更好地呈现数据,使代码输出更加规范和具有可读性。
    C++ 参考手册
    在这里插入图片描述

💯格式化输出的理论概述

在 C++ 中,cout 是最常用的输出流,我们通常用它来输出变量和字符串。然而,当涉及复杂的格式化需求,如对齐表格控制浮点精度设置字段宽度时,简单的 cout 就显得力不从心。在这些情况下,C++ 提供了 <iomanip> 头文件,该头文件包含了一组称为操纵符(I/O manipulators)的工具,可以帮助我们更精细地控制输出格式。通过这些操纵符,我们可以以简洁的方式实现数据的对齐、精度控制和特殊的数值表示方式。

格式化输出的目的不仅在于使数据更加美观,还在于提高数据的可读性和条理性。例如,在生成报表科学计算数据对比等场景中,保持对齐、统一数值格式,或对某些值进行标识是至关重要的。这些技巧能够有效提升程序的可读性与专业性,进而使代码的使用和维护更加便利。
在这里插入图片描述


💯控制输出宽度和填充字符

在许多应用中,我们需要指定输出内容的宽度,以确保数据对齐、整齐。在这种情况下,操纵符 setwsetfill 就非常有用。
在这里插入图片描述


setw 操作符

setw 操作符用于设置输出内容的最小宽度。它只对紧跟其后的输出项生效。例如:

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

int main() {
    int a = 123;
    cout << "默认宽度: " << a << endl;
    cout << "宽度设置为5: " << setw(5) << a << endl;
    cout << "宽度设置为10: " << setw(10) << a << endl;
    return 0;
}

在这里插入图片描述

在上述代码中,setw(10) 将输出的宽度设置为 10。如果实际输出内容的长度小于 10,那么 cout 将用空格填充不足的部分。输出结果如下:

默认宽度: 123
宽度设置为5:   123
宽度设置为10:        123

可以看到,数字 123 被右对齐,并且前面填充了空格,使得输出的总宽度为 10 个字符。这种方法在输出多行数据时尤其有用,可以让不同数据列之间保持对齐,从而增强视觉上的条理性。


setfill 操作符

setfill 操作符用于设置宽度填充的字符。例如:

cout << "宽度为10, 不够时填充*: " << setw(10) << setfill('*') << a << endl;

在这里插入图片描述

输出结果为:

宽度为10, 不够时填充*: *******123

在此例中,setw(10) 将宽度设置为 10,setfill('*') 将填充字符设为 *,因此空余部分被 * 填充而非默认的空格。setfill 在需要突出某些输出时特别有用,比如在生成报表时用特定符号区分表格边界或某些特殊字段。

setwsetfill 的结合使用,可以实现对输出格式的灵活控制,使输出不仅对齐,还具有特定的视觉风格。这在生成具有高可读性和专业感的数据报表时尤为重要。


💯控制浮点数的显示格式

浮点数的输出常常需要特定的格式,例如控制小数位数或者以科学计数法显示。在 C++ 中,这些需求可以通过操纵符 fixedscientificsetprecision 实现。
在这里插入图片描述


fixedscientific

  • fixed:将浮点数以固定小数点的形式显示,即使数值较大,也不会使用科学计数法。它在财务计算等场景中非常实用,因为金额通常以固定的小数位数表示,以确保输出的一致性。
  • scientific:以科学计数法形式输出浮点数,通常用于非常大或非常小的数值。例如在科学研究或工程计算中,科学计数法可以使结果更加简洁和易读。

以下是示例代码:

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

int main() {
    double pi = 3.141592653589793;
    cout << "默认: " << pi << endl;
    cout << "固定小数点方式: " << fixed << pi << endl;
    cout << "科学计数法方式: " << scientific << pi << endl;
    return 0;
}

在这里插入图片描述

输出结果:

默认: 3.14159
固定小数点方式: 3.141593
科学计数法方式: 3.141593e+00

可以看到,默认情况下输出保留 6 位有效数字,而 fixed 会使输出以固定小数点形式显示,scientific 则将其以科学计数法形式输出。对于大多数日常应用场景,fixed 常用于财务报表、精密计算结果等需要固定格式的场合,以确保输出的统一性。


setprecision

setprecision 操作符用于设置浮点数的小数点后的精度。例如:

cout << "固定小数点, 小数点后2位: " << fixed << setprecision(2) << pi << endl;

在这里插入图片描述

输出结果为:

固定小数点, 小数点后2位: 3.14

结合使用 fixedsetprecision(2),可以将小数点后的位数限制为 2 位。这种精度控制对于财务报表或科学计算结果的显示非常有用,因为它可以减少精度引起的数值差异,从而保证数据的一致性和可读性。


💯整数的进制表示控制

在某些应用场景中,我们需要以不同的进制表示整数,例如十进制、十六进制或八进制。在 C++ 中,可以使用 dechexoct 操纵符来控制整数的进制输出方式。
在这里插入图片描述


dechexoct

  • dec:以十进制形式输出(这是默认方式)。
  • hex:以十六进制形式输出,这在处理内存地址或位运算时非常常见。
  • oct:以八进制形式输出,虽然现代应用中较少使用八进制,但在某些领域它依然有其独特的应用价值。

示例代码如下:

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

int main() {
    int n = 255;
    cout << "+十进制: " << dec << n << endl;
    cout << "+十六进制: " << hex << n << endl;
    cout << "+八进制: " << oct << n << endl;
    return 0;
}

在这里插入图片描述

输出结果:

+十进制: 255
+十六进制: ff
+八进制: 377

可以看到,使用不同的操纵符可以将同一个整数 255 分别表示为十进制、十六进制和八进制。这种多样化的表示方法使得数据在不同应用场景下更加灵活,尤其是在底层编程和调试过程中,十六进制的表示方式尤为重要,因为它与计算机内部的二进制表示更为接近。


💯控制对齐方式

在输出复杂数据时,我们常常需要指定对齐方式,以确保数据的整齐性和可读性。在 C++ 中,默认的对齐方式是右对齐,但我们可以使用 left 操纵符来实现左对齐。
在这里插入图片描述


leftright

  • right:这是默认的对齐方式,通常适用于数值数据,使得同一列的数据看起来更加整齐。
  • left:将输出内容左对齐,适用于字符串数据,使得文本输出更加自然,尤其是在表格化输出时有助于增强可读性。

示例代码如下:

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

int main() {
    int n = 123;
    cout << "右对齐: " << setw(10) << right << n << endl;
    cout << "左对齐: " << setw(10) << left << n << endl;
    return 0;
}

在这里插入图片描述

输出结果:

右对齐:        123
左对齐: 123       

通过使用 setw(10) 设置宽度为 10,并结合 leftright 操纵符,可以实现数据的左右对齐。这种对齐控制在格式化表格数据时非常有用,可以确保每一列的数据在视觉上保持对齐,从而使输出更加整齐有序,便于阅读。


💯结合操纵符的应用场景

在这里插入图片描述


表格化输出

如果你想在控制台中输出对齐的表格,可以结合 setwsetfillleftright 操作符来实现。例如:

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

int main() {
    cout << left << setw(15) << "Name" << setw(10) << "Age" << setw(15) << "City" << endl;
    cout << setfill('-') << setw(40) << "" << setfill(' ') << endl;
    cout << left << setw(15) << "Alice" << setw(10) << 30 << setw(15) << "New York" << endl;
    cout << left << setw(15) << "Bob" << setw(10) << 25 << setw(15) << "Los Angeles" << endl;
    return 0;
}

在这里插入图片描述

输出结果:

Name           Age       City           
----------------------------------------
Alice          30        New York       
Bob            25        Los Angeles    

通过合理利用操纵符,输出内容整齐对齐,显得更加美观和专业。这样的输出方式在生成控制台报表时尤为重要,可以使得数据之间的关系更加清晰,并显著提高可读性。

在更加复杂的应用场景中,例如多列数据的复杂报表或者需要精细对齐的输出内容,我们可以灵活地使用这些操纵符,结合逻辑控制来实现动态输出。这些格式化输出技巧对于数据展示、对比分析以及终端用户交流等方面都至关重要。


💯小结

  • 在这里插入图片描述
    通过本文的学习,我们深入探讨了如何在 C++ 中利用 <iomanip> 提供的多种操纵符实现格式化输出。我们讨论了如何控制输出宽度、填充字符、浮点数精度、整数进制表示方式以及对齐方式等操作。这些技巧对于编写更为复杂和专业的 C++ 程序,提升代码输出的规范性和可读性具有重要意义。
    掌握这些技巧后,你可以灵活应用于各种项目中,例如生成数据报表、对齐数据输出,或者进行格式化的控制台展示,从而使代码更加具有专业水准。这些技巧在自动化报告生成科学计算结果展示以及数据库记录打印等实际项目中具有广泛应用。
    希望这篇文章能对你在 C++ 学习中的进阶之路有所帮助。通过深入掌握这些细节,你将不仅能显著提高代码的输出效果,还能够更有效地与他人分享和交流数据和信息。如果你有任何关于 C++ 输出格式化的问题,欢迎随时进行讨论和交流。

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2254418.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Rust : 生成日历管理markdown文件的小工具

需求&#xff1a; 拟生成以下markdown管理小工具&#xff0c;这也是我日常工作日程表。 可以输入任意时间段&#xff0c;运行后就可以生成以上的markdown文件。 一、toml [package] name "rust-workfile" version "0.1.0" edition "2021"[d…

Spring01——Spring Framework系统架构

spring学习路线 Spring Framework系统架构 相关概念 低耦合&#xff1a;是指系统中各个模块或组件之间的依赖性较低&#xff0c;即它们之间的联系较少、交互简单。这种设计原则的目的是为了提高系统的灵活性和可维护性&#xff0c;便于模块的独立开发、测试和替换。解耦&…

MicroBlaze软核开发(一):Hello World

实现功能&#xff1a;使用 MicroBlaze软核 串口打印 Hello World Vivado版本&#xff1a;2018.3 目录 MicroBlaze介绍 vivado部分&#xff1a; 一、新建工程 二、配置MicroBlaze 三、添加Uart串口IP 四、生成HDL文件编译 SDK部分&#xff1a; 一、导出硬件启动SDK 二、…

ZLMediaKit+wvp (ffmpeg+obs)推拉流测试

这里使用了两种方式: ffmpeg命令和 OBS OBS推流在网上找了些基本没有说明白的, 在ZLMediaKit的issues中看到了一个好大哥的提问在此记录一下 使用OBS推流&#xff0c;rtmp&#xff0c;报鉴权失败 推流 1. ffmpeg命令推流 官方说明文档地址: 推流规则 rtsp://192.168.1.4:10554…

微信小程序之简单的数据中心管理平台(1)

微信小程序之简单的数据中心管理平台&#xff08;1&#xff09; 引言 随着微信小程序的广泛应用&#xff0c;越来越多的企业开始探索如何利用这一技术开发高效、便捷的管理平台。数据中心管理作为信息化建设的重要组成部分&#xff0c;需要一个灵活、可扩展的界面来实现资源的…

【计算机网络】实验13:运输层端口

实验13 运输层端口 一、实验目的 本次实验旨在验证TCP和IP运输层端口号的作用&#xff0c;深入理解它们在网络通信中的重要性。通过实验&#xff0c;我将探讨端口号如何帮助区分不同的应用程序和服务&#xff0c;使得在同一台主机上能够同时运行多个网络服务而不发生冲突。此…

人工智能学习用的电脑安装cuda、torch、conda等软件,版本的选择以及多版本切换

接触人工智能的学习三个月了&#xff0c;每天与各种安装包作斗争&#xff0c;缺少依赖包、版本高了、版本低了、不兼容了、系统做一半从头再来了。。。这些都是常态。三个月把单位几台电脑折腾了不下几十次安装&#xff0c;是时候总结一下踩过的坑和积累的经验了。 以一个典型的…

数组常见查找算法

文章目录 时间复杂度1. 顺序查找&#xff08;Linear Search&#xff09;2. 二分查找&#xff08;Binary Search&#xff09;3. 插值查找&#xff08;Interpolation Search&#xff09;4.分块查找5.哈希查找 时间复杂度 衡量算法执行时间随输入规模增长而增长的速度的一个概念。…

langgraph 多智能体 Multi-agent supervisor

1. 工具定义 1.1网络搜索工具 from typing import Annotated import os from langchain_community.tools.tavily_search import TavilySearchResults from langchain_core.tools import tool from langchain_experimental.utilities import PythonREPLos.environ["TAVIL…

【Maven系列】深入解析 Maven 镜像配置

前言 Maven 是一个流行的 Java 项目管理和构建工具&#xff0c;可以自动化构建项目、管理依赖、生成报告等。在Maven构建项目时&#xff0c;通常经常需要下载各种依赖。默认情况下&#xff0c;Maven 会从中央仓库下载这些依赖&#xff0c;但在某些情况下&#xff0c;这个过程可…

HTML 添加 文本水印

body,html {margin: 0;height: 100vh;width: 100vw;} // 自定义文案const setting {text: "水印文案", // 水印内容innerDate: true, // 在水印下方增加日期width: 110, // 水印宽度};// 自定义文字水印const watermark (function () {return {build: function (a…

华为HCIE-Datacom认证笔试+实验考试介绍

华为HCIE数通认证考试是面向那些希望成为数通网络领域专家的人员&#xff0c;考试通常两部分&#xff1a;笔试和实验考试。 考试科目&#xff1a; HCIE-Datacom笔试考试内容&#xff1a; HCIE-Datacom V1.0考试覆盖数据通信领域路由交换高阶技术、企业网络架构全景、园区网络…

PyCharm+Selenium+Pytest配置小记

1、下载ChromeDriver&#xff1a; Chrome130以后的Driver下载&#xff1a; Chrome for Testing availabilityhttps://googlechromelabs.github.io/chrome-for-testing/ &#xff08;1&#xff09;查看自己Crome浏览器的版本&#xff1a;设置-->关于 Chrome&#xff1b; &…

我们来学webservie - WSDL

WSDL 题记WSDL系列文章 题记 举个例子 酒桌上大领导们谈笑风生&#xff0c;把酒临风,其喜洋洋者矣老张说能签下xx项目&#xff0c;一来证明了集团在行业中的翘楚地位&#xff0c;二来感谢各位领导给予的大力支持接下来的一周&#xff0c;项目经理、业务顾问相继入场&#xff0…

weblogic开启https

JSK证书生成 生成密钥库和证书 使用Java的keytool命令来生成一个Java密钥库&#xff08;Keystore&#xff09;和证书。keytool是Java开发工具包&#xff08;JDK&#xff09;中用于管理密钥库和证书的命令行工具。 #创建证书存放目录 [weblogicosb1 jksHL]$ mkdir -p /home/w…

激活函数在神经网络中的应用与选择

目录 ​编辑 Sigmoid函数 代码示例与分析 Tanh函数 代码示例与分析 ReLU函数 代码示例与分析 Leaky ReLU函数 代码示例与分析 PReLU函数 代码示例与分析 ELU函数 代码示例与分析 SELU函数 代码示例与分析 Softmax函数 代码示例与分析 结论 在深度学习领域&am…

使用Tauri创建桌面应用

当前是在 Windows 环境下 1.准备 系统依赖项 Microsoft C 构建工具WebView2 (Windows10 v1803 以上版本不用下载&#xff0c;已经默认安装了) 下载安装 Rust下载安装 Rust 需要重启终端或者系统 重新打开cmd&#xff0c;键入rustc --version&#xff0c;出现 rust 版本号&…

2023年第十四届蓝桥杯Scratch国赛真题—推箱子

推箱子 程序演示及其源码解析&#xff0c;可前往&#xff1a; https://www.hixinao.com/scratch/creation/show-188.html 若需在线编程&#xff0c;在线测评模考&#xff0c;助力赛事可自行前往题库中心&#xff0c;按需查找&#xff1a; https://www.hixinao.com/ 题库涵盖…

[RabbitMQ] RabbitMQ常见应用问题

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

HarmonyOS 5.0应用开发——UIAbility生命周期

【高心星出品】 文章目录 UIAbility组件创建AbilityUIAbility的生命周期Create状态WindowStageCreate状态Foreground和Background状态WindowStageWillDestroy状态Destroy状态 UIAbility组件 UIAbility组件是一种包含UI的应用组件&#xff0c;主要用于和用户交互。 UIAbility组…