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

【C++】printf 函数详解与格式化输出控制


在这里插入图片描述

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

文章目录

  • 💯前言
  • 💯`printf` 基础用法
    • 1.1 `printf` 的常见占位符
    • 1.2 占位符与参数的对应关系
    • 1.3 换行控制
      • 示例:
  • 💯格式化输出控制
    • 2.1 输出宽度控制
      • 2.1.1 指定最小宽度
    • 2.2 对齐方式控制
      • 示例:
    • 2.3 限定小数位数
      • 示例:
    • 2.4 同时指定宽度和小数位数
    • 2.5 动态指定宽度和小数位数
      • 示例:
    • 2.6 科学计数法输出
      • 示例:
  • 💯实际应用场景与总结
    • 3.1 表格输出
    • 3.2 数值精度控制
  • 💯小结


在这里插入图片描述


💯前言

  • C++ 编程的学习与实践过程中,printf 函数是用于实现格式化输出的核心工具之一。作为 C 标准库中的重要功能,printf 不仅构成了输入输出操作的基础,它的广泛应用更使其成为控制台交互数据呈现的关键工具。从简单的调试信息打印到复杂的格式化报告,printf 函数在众多场景中展现出不可替代的作用。本文旨在对 printf 函数进行深入探讨,分析其多种控制方式和潜力,包括宽度控制对齐方式的调整精度设定等。此外,还通过详细的代码示例,系统化帮助读者掌握这一工具的高级用法。
    C++ 参考手册
    在这里插入图片描述
    printf
    在这里插入图片描述

💯printf 基础用法

printf 函数是 C 标准输入输出库 <cstdio> 中的一个核心函数,用于格式化输出。其函数原型如下:

int printf(const char *format, ...);
  • format:格式字符串,用于定义输出文本的格式。格式字符串不仅可以包含普通字符,还包含格式说明符,这些占位符用于插入变量的值。通过这些占位符,开发者可以灵活地控制如何将变量的值打印到控制台。
  • 可变参数:用于替代 format 字符串中的占位符。根据给定参数的数量和类型,printf 会将这些值按照指定格式输出到标准输出设备上。

在这里插入图片描述


1.1 printf 的常见占位符

占位符描述
%d十进制整数。
%lld十进制 long long int 类型。
%f小数(包括 floatdouble 类型)。
%Lflong double 类型浮点数。
%c单个字符。
%s字符串。
%a十六进制浮点数,字母输出为小写。
%A十六进制浮点数,字母输出为大写。
%e使用科学计数法表示的浮点数,指数部分为小写 e
%E使用科学计数法表示的浮点数,指数部分为大写 E
%i整数,功能与 %d 类似。
%g浮点数,有效数字为 6 位;当整数部分超过 6 位时,自动转为科学计数法(小写 e)。
%G类似于 %g,但科学计数法中使用大写 E
%hdshort int 类型的十进制整数。
%hoshort int 类型的八进制整数。
%hxshort int 类型的十六进制整数。
%huunsigned short int 类型。
%ldlong int 类型的十进制整数。
%lolong int 类型的八进制整数。
%lxlong int 类型的十六进制整数。
%luunsigned long int 类型。
%llolong long int 类型的八进制整数。
%llxlong long int 类型的十六进制整数。
%lluunsigned long long int 类型。
%Lelong double 类型的科学计数法浮点数。
%n已输出的字符数量,不进行输出操作,仅将值存储在指定变量中。
%o八进制整数。
%p指针地址。
%u无符号整数(unsigned int 类型)。
%x十六进制整数,小写字母。
%zdsize_t 类型。
%%输出一个百分号字符。

这些占位符涵盖了大多数常见的数据类型,是有效掌握 printf 函数的关键。特别是在多种数据类型混合输出的情况下,合理选择占位符是确保输出结果准确性可读性的基本保证。

在这里插入图片描述


1.2 占位符与参数的对应关系

printf() 中,格式化字符串中的占位符可以被动态的参数值替代,从而使得输出内容更加灵活。

#include <cstdio>
// 输出:There are 3 apples
int main()
{printf("There are %d apples\n", 3);return 0;
}

在这里插入图片描述

在上述示例中,字符串 "There are %d apples\n" 包含一个占位符 %d,用于表示即将插入的整数。这里 %d 指定了需要一个整数来替代,而 3 作为参数传递给 printf,替换 %d。因此,最终的输出结果是 There are 3 apples

这种方式可以灵活地输出不同类型的数据,例如字符串浮点数等。理解占位符与参数之间的对应关系对于确保输出的正确性至关重要。如果占位符和参数类型不匹配,可能会导致错误输出,甚至引发未定义行为


1.3 换行控制

使用 printf 输出内容时,默认情况下光标会停留在输出文本的末尾,不会自动换行。如果希望输出后换行,需要在字符串中显式添加 \n 换行符。

#include <cstdio>
int main()
{printf("Hello");  // 输出后不会自动换行printf("World!");  return 0;
}

在这里插入图片描述


示例:

#include <cstdio>
int main()
{printf("Hello, World!\n");  // 输出后换行return 0;
}

在这里插入图片描述

此外,可以在格式字符串中添加多个换行符,以实现多行输出。例如:

#include <cstdio>int main() {printf("Hello\nWorld\n");return 0;
}

在这里插入图片描述

输出结果为:

Hello
World

Hello 后添加换行符 \n 使得输出的下一部分继续在新的一行,从而实现换行效果。在实践中,合理使用换行符可以显著改善输出的可读性,尤其在需要以分行方式呈现列表或表格信息时,这种控制尤为重要。


💯格式化输出控制

通过格式化输出控制,printf 函数可以更加精确地控制数据呈现,包括宽度控制、对齐方式调整以及小数精度设定。

在这里插入图片描述


2.1 输出宽度控制

printf 函数允许通过指定宽度参数来控制输出内容的显示长度。如果实际内容不足指定宽度,系统会在内容前面补充空格。
在这里插入图片描述


2.1.1 指定最小宽度

通过在占位符中指定一个数值,可以控制输出内容的最小宽度。例如:

#include <cstdio>int main() {printf("%5d\n", 123);return 0;
}

在这里插入图片描述

  • %5d 表示输出的整数最小宽度为 5。
  • 如果输出内容不足 5 个字符,printf 会在左侧补空格以填充到指定宽度。

输出:

  123

如果实际内容超过指定的最小宽度,则按实际长度显示,不进行截断。例如:

#include <cstdio>int main() {printf("%5d\n", 123456);return 0;
}

在这里插入图片描述

输出:

123456

在实际应用中,限定输出宽度的功能常用于对齐多行输出,使得表格数据更加整齐,特别是在输出多个数据项时尤为重要。


2.2 对齐方式控制

默认情况下,printf 的输出是右对齐的。如果希望输出内容左对齐,可以在宽度说明符前添加 - 符号。
在这里插入图片描述


示例:

#include <cstdio>int main() {printf("%-5d\n", 123);printf("%-5d\n", 66);return 0;
}

在这里插入图片描述

  • %-5d 表示宽度为 5 且左对齐。

输出:

123
66  

左对齐的输出方式常用于对齐表格中的不同列,特别是包含不同长度的字符串数值列时,有助于提高输出的清晰度可读性


2.3 限定小数位数

对于浮点数,printf 允许通过精度控制来限定小数位数。默认情况下,%f 输出小数点后 6 位。
在这里插入图片描述


示例:

#include <cstdio>int main() {printf("%.2f\n", 0.5);return 0;
}

在这里插入图片描述

  • %.2f 表示保留 2 位小数。

输出:

0.50

如果需要保留 3 位小数,可以写成 %.3f

对小数位数的精度控制在财务数据或科学计算中非常关键,确保数值符合特定的精度要求,避免错误的精度影响结果。


2.4 同时指定宽度和小数位数

printf 中,可以同时指定输出的最小宽度和小数点后的精度。例如:

printf("%6.2f\n", 0.5);

在这里插入图片描述

  • %6.2f
    • 6 表示最小宽度为 6。
    • .2 表示保留 2 位小数。

输出:

  0.50

由于实际输出为 4 个字符,因此在前面补充 2 个空格以满足宽度要求。这种格式控制在需要对齐输出的数据表格时非常实用,确保各行数据对齐,避免因数据长度不同导致的混乱。


2.5 动态指定宽度和小数位数

printf 还支持使用 * 动态指定宽度和精度,这在需要根据运行时条件调整输出格式时非常有用。

示例:

#include <cstdio>int main() {printf("%*.*f\n", 6, 2, 0.5);return 0;
}

在这里插入图片描述

  • 第一个 * 表示宽度,通过参数 6 动态指定。
  • 第二个 * 表示小数位数,通过参数 2 动态指定。
  • 输出的数值为 0.5

输出:

  0.50

通过这种方式,可以根据程序逻辑动态调整输出格式,而无需在编译时硬编码格式字符串,从而提升代码的灵活性和可维护性。


2.6 科学计数法输出

使用 %e%E 可以将浮点数以科学计数法形式输出。

示例:

#include <cstdio>int main() {printf("%e\n", 12345.6789);return 0;
}

在这里插入图片描述

输出:

1.234568e+04

可以使用 %.ne 限定小数位数,在处理非常大或非常小的数值时,科学计数法可以显著提高数据的可读性。


💯实际应用场景与总结

在这里插入图片描述


3.1 表格输出

printf 的宽度和对齐控制非常适合用于输出对齐的数据表格。例如:

#include <cstdio>int main() {printf("%-10s %10s\n", "Name", "Score");printf("%-10s %10d\n", "Alice", 90);printf("%-10s %10d\n", "Bob", 85);return 0;
}

在这里插入图片描述

输出:

Name           Score
Alice             90
Bob               85

结合左对齐和右对齐的控制,使得输出表格整齐、美观,尤其在处理多列数据时,这种对齐控制显著提高了数据的可读性和视觉上的整洁性。


3.2 数值精度控制

在财务和科学计算中,数值的精度控制至关重要。例如:

#include <cstdio>int main() {printf("Total Amount: $%.2f\n", 123.456);return 0;
}

在这里插入图片描述

输出:

Total Amount: $123.46

通过控制小数位数,能够确保金额显示符合财务标准,避免过多或不足的小数位导致的误差,使输出更为专业和规范。


💯小结

  • 在这里插入图片描述
    本文详细探讨了 C++printf 函数的多种用法,包括 基础输出格式化控制宽度与小数位数设置,以及 动态指定宽度和精度 等高级用法。printf 是一个功能强大灵活的输出工具,可以帮助开发者以多种方式格式化输出数据。在需要精细控制输出内容的场景中,掌握这些用法至关重要
    printf 提供了丰富的输出控制选项,使得程序的输出更加 整齐清晰专业。它被广泛应用于 调试报告生成控制台交互 等多个场景。如果对 printf 的某些用法存在疑问,可以参考本文的代码示例进行实践,因为实践是理解和掌握这些概念的最佳途径
    通过不断的练习应用,你将逐步掌握 printf 的各种高级用法,使得你的代码在输出方面更加 灵活精细专业。希望本文能为你的编程学习与工作提供有益的帮助,并助力你在 C++ 编程的道路上迈向更高的水平。

在这里插入图片描述


相关文章:

【C++】printf 函数详解与格式化输出控制

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;printf 基础用法1.1 printf 的常见占位符1.2 占位符与参数的对应关系1.3 换行控制示例&#xff1a; &#x1f4af;格式化输出控制2.1 输出宽度控制2.1.1 指定最小宽度 2.2 …...

HDFS 操作命令

在现代的企业环境中&#xff0c;单机容量往往无法存储大量数据&#xff0c;需要跨机器存储。统一管理分布在 集群上的文件系统称为 分布式文件系统 。 HDFS &#xff08; Hadoop Distributed File System &#xff09;是 Apache Hadoop 项目的一个子项目&#xff0c; Hadoo…...

html ul li 首页渲染多条数据 但只展示八条,其余的数据全部隐藏,通过icon图标 进行展示

<div style"float: left;" id"showMore"> 展开 </div> <div style"float: left;“id"hideLess"> 收起 </div> var data document.querySelectorAll(.allbox .item h3 a); const list document.querySelectorAl…...

Facebook:筑牢隐私安全堡垒,守护社交净土

在全球社交媒体平台中&#xff0c;Facebook一直是风靡全球的佼佼者。然而&#xff0c;随着数字化信息的迅速膨胀&#xff0c;用户隐私保护的重要性日益凸显。面对用户对数据安全性的高度重视&#xff0c;Facebook致力于通过一系列措施来确保隐私保护&#xff0c;守护每位用户的…...

2024年构建PHP应用开发环境

文章目录 前言选择合适的PHP版本安装与配置PHP环境Windows平台Linux平台macOS平台 集成Web服务器数据库连接与管理使用Composer进行依赖管理调试工具的选择代码质量管理部署与持续集成安全性考虑参考资料结语 前言 随着互联网的发展&#xff0c;PHP作为一门成熟的服务器端编程…...

Apache Commons Chain 与 Spring Boot 整合:构建用户注册处理链

文章目录 概述1. 环境准备2. 创建自定义上下文3. 创建命令验证用户输入保存用户数据发送欢迎邮件 4. 构建并执行处理链5. 使用处理链6. 运行结果7. 总结 概述 本文档旨在展示如何在 Spring Boot 应用中使用 Apache Commons Chain 来实现一个用户注册的处理链。我们将通过 Chai…...

一、测试工具LoadRunner Professional脚本编写-录制前设置

设置基于URL的脚本 原因:基于HTML的脚本会导致login接口不能正确录制 设置UTF-8 原因:不勾选此项会导致脚本中文变为乱码...

React Native 组件详解之SectionList、StatusBar、Switch、Text 、 TextInput

在本文中&#xff0c;我们将详细介绍 React Native 中的五个常用组件&#xff1a;SectionList、StatusBar、Switch、Text 和 TextInput。每个组件都有其独特的用途和特性&#xff0c;我们将通过示例代码和 API 说明来帮助你更好地理解和使用它们。 SectionList SectionList 是…...

阿里云:aliyun-cli和ali-instance-cli

概念&#xff1a; 这篇文章只是来澄清一下这俩“cli"之间的区别和联系&#xff1a; aliyun cli 和 ali-instance-cli 都是阿里云提供的命令行工具&#xff0c;但它们的功能和使用场景有所不同。 1. aliyun cli 是一个通用的阿里云命令行接口工具&#xff0c;它允许用户…...

Linux 远程连接服务

远程连接服务器简介 什么是远程连接服务器 远程连接服务器通过文字或图形接口方式来远程登录系统&#xff0c;让你在远程终端前登录linux主机以取得可操 作主机接口&#xff08;shell&#xff09;&#xff0c;而登录后的操作感觉就像是坐在系统前面一样。 远程连接服务器的功…...

Docker 安装和使用

#Docker 安装和使用 文章目录 1. 安装2. 干掉讨厌的 sudo3. 使用镜像源3.1. 使用 upstart 的系统3.2. 使用 systemd 的系统 4. 基本使用4.1. 容器操作4.2. 镜像操作 5. 网络模式说明5.1. bridge 模式5.2. host 模式5.3. container 模式5.4. none 模式 6. 查看 Docker run 启动参…...

web基础和http协议 附:nginx服务的安装

web基础和http协议: https://www.baidu.com/ URL https:// 协议 http:// www.baidu.com/ 域名 web介绍: DNS和域名 DNS解析的方式: 1、运营商 2、/etc/hosts 人工配置的域名和ip地址之间的映射关系 3、/etc/resolv.conf dns服务器的ip地址 bind,内网解析域名和ip地址…...

springboot利用easypoi实现简单导出Excel

vue springboot利用easypoi实现简单导出 前言一、easypoi是什么&#xff1f;二、使用步骤 1.传送门2.前端vue3.后端springboot 3.1编写实体类&#xff08;我这里是dto,也一样&#xff09;3.2控制层结尾 前言 今天玩了一下springboot利用easypoi实现excel的导出&#xff0c;以前…...

【前端新手小白】学习Javascript的【开源好项目】推荐

目录 前言 1 项目介绍 1.1 时间日期类 1.2 网页store类 1.3 事件类 1.4 Number类 1.5 String类 1.6 正则验证类 1.7 ajax类 1.8 data数据类 1.9 browser浏览器类 2 学习js-tool-big-box开源项目时有哪些收获 2.1 你可以这样做 2.2 如果你需要使用本项目 2.3 你…...

CentOS7虚拟机 网络适配器 NAT模式和桥接模式区别

一、环境介绍 宿主机&#xff1a;Windows电脑 虚拟机&#xff1a;VMware下的CentOS7 局域网&#xff1a;路由器下的各真实主机组成的网络 内部局域网&#xff1a;宿主机构建的一个内部网路 二、NAT和桥接网络链接模式区别 NAT模式&#xff1a;相当于宿主机构建一个内部局域网&a…...

sql删除冗余数据

工作或面试中经常能遇见一种场景题&#xff1a;删除冗余的数据&#xff0c;以下是举例介绍相应的解决办法。 举例&#xff1a; 表结构&#xff1a; 解法1&#xff1a;子查询 获取相同数据中id更小的数据项&#xff0c;再将id不属于其中的数据删除。-- 注意&#xff1a;mysql中…...

STM32-C语言基础知识

C语言基础知识 stdint.h简介 给寄存器某个位赋值 给位6赋值为1流程&#xff1a;先清0&#xff0c;再赋值 带参数的宏定义 建议使用do {…}while(0)来构造宏定义 条件编译 条件编译后面必须跟宏语句&#xff0c;如#if _LED_H 指针使用常见的2大问题 1、未初始化 2、越界使…...

【Point-LIO】基于Ubuntu20.04的ROS1平台的Point-LIO部署Mid-360激光雷达

0、前言 Mid360参数 1、代码拉取 2、代码编译运行 文件结构 编译流程&#xff1a; 1、先编译livox_ros_driver2 2、编译整个工程文件 3、运行launch文件&#xff08;livox_ros_driver2&#xff09; 成功启动&#xff1a; 3、实物运行 看得出来&#xff0c;在rviz…...

02_Node.js模块化

02_Node.js模块化 知识点自测 以下代码运行的结果是多少&#xff1f; const arr [10, 20, 30] const result arr.map(val > val 1).reduce((sum, val) > sum val, 0) console.log(result) A&#xff1a;60 B&#xff1a;63 <details><summary>答案</…...

网络——HTTP与HTTPS三次握手和四次挥手

HTTP协议本身并不直接处理TCP连接的建立和关闭&#xff0c;这些是由底层的TCP协议来完成的。但是&#xff0c;由于HTTP通常运行在TCP之上&#xff0c;因此理解TCP的三次握手&#xff08;用于建立连接&#xff09;和四次挥手&#xff08;用于关闭连接&#xff09;对于理解HTTP通…...

ModelScope-Agent(1): 基于开源大语言模型的可定制Agent系统

目录 简介快速入门 简介 github地址 快速入门 看前两篇&#xff0c;调用千问API和天气API # 选用RolePlay 配置agent from modelscope_agent.agents.role_play import RolePlay # NOQArole_template 你扮演一个天气预报助手&#xff0c;你需要查询相应地区的天气&#x…...

开发知识点-uniCloud

开发知识点-uniCloud 服务空间云函数 cloudfunctions云对象importObjectJSON 格式的文档型数据库Collection unicloud数据的指定表集合 DB SchemaJQL 语法参考资料 服务空间 项目关联空间 云函数 cloudfunctions 云对象importObject JSON 格式的文档型数据库 nosql 非关系…...

Redis——主从复制原理

Redis的主从复制原理是其高可用性和分布式读取能力的重要基础。以下是Redis主从复制原理的详细解释&#xff1a; 一、主从复制的基本概念 Redis的主从复制是一种数据复制和备份的方式&#xff0c;它允许一个主节点&#xff08;Master&#xff09;将其所有的数据同步到一个或多…...

MATLAB数学建模之画图汇总

MATLAB是一种强大的数学软件&#xff0c;广泛应用于工程计算、控制设计、信号处理等领域。在数学建模中&#xff0c;MATLAB的绘图功能可以帮助我们直观地展示数据和模型结果。 1. 二维数据曲线图 1.1 绘制二维曲线的基本函数 plot函数用于绘制二维平面上的线性坐标曲线图&am…...

Milvus attu - docker 使用 及 版本兼容

文章目录 版本查看attu 和 milvus 的兼容性Docker 加载attu docker 合并到 Milvus文件管理使用 docker compose 挂在 Milvus,登录 attu 出现报错: Error: Failed to connect to Milvus: Error: 1 CANCELLED: Call cancelled 于是检查兼容问题 版本查看 Milvus 版本发布: htt…...

okHttp的tcp连接池的复用

okhttp的连接池是tcp连接池吧&#xff0c;是两台机器之间的连接&#xff0c;ip:port连接&#xff0c;然后具体的接口再添加具体的url吗&#xff1f; 具体的 HTTP 请求&#xff08;包括 URL、请求方法、头部等&#xff09;则是在复用的 TCP 连接上进行传输的。 是的&#xff0c…...

nginx 自启动失败:Failed to parse PID from file: Invalid argument

记一次nginx自启动配置的问题 我的配置如下&#xff1a; [Unit] DescriptionA high performance web server and a reverse proxy server Afternetwork.target[Service] Typeforking PIDFile/home/u24/nginx/pid/nginx.pid ExecStartPre/home/u24/nginx/sbin/nginx -t -q -g d…...

Wwise SoundBanks内存优化

1.更换音频格式为Vorbis 2.停用多余的音频&#xff0c;如Random Container的随机脚步声数量降为2个 3.背景音乐勾选“Stream”。这样就让音频从硬盘流送到Wwise&#xff0c;而不是保存在内存当中&#xff0c;也就节省了内存 4.设置最大发声数Max Voice Instances 5.设置音频…...

centos 常见问题处理

免密登录配置 # 在当前机器下 执行命令 生成 私钥和公钥 ~/.ssh 目录下 ssh-keygen -t rsa # 执行如下命令 把公钥 放到 对应机器上的 ~/.ssh/authorized_keys ssh-copy-id 172.17.68.220 # 如此 两台机器两两配置 centos ssh连接慢 vim /etc/ssh/sshd_config # UseD…...

简述Vue每个周期具体适合哪些场景?

Vue.js 的生命周期分为几个不同的阶段&#xff0c;每个阶段都对应着组件的创建、挂载、更新和销毁。以下是对 Vue 实例每个生命周期周期的具体场景描述&#xff1a; 创建前/后&#xff08;beforeCreate / created&#xff09; beforeCreate&#xff1a;在实例初始化之后&#x…...