printf使用占位符控制输出格式

2023-05-16

printf()函数提供丰富的占位符参数以便精细地控制输出格式,再进行字符操作的时候我们可能会使用到sprintf类函数进行处理,因此这里对printf()函数的格式化输出控制进行较为“详细”讨论。

简单的printf()语法

//Project - Variable
#include <stdio.h>

int main(){
    int n = 3;
    float fPrice = 3.6;
    float fAmount = n*fPrice;
    float fMoney = 20;
    fMoney = fMoney - fAmount;
    printf("%d apples, %.1f for each, %.2f in total.\n",n,fPrice,fAmount);
    printf("20 - %.2f = %.2f.",fAmount,fMoney);
    return 0;
}

上述代码执行结果如下:

3 apples, 3.6 for each, 10.80 in total.
20 - 10.80 = 9.20.

printf占位符解析
上述程序及上图展示了通过printf()进行格式化输出的最基本方法。程序中的printf( )函数共有4个参数,其中,第1个参数由双引号包裹,是一个字符串。该字符串中包含了三个占位符(place holder),在格式化输出过程中,这些占位符将依次由后续参数的值替换。图1展示了该行的各占位符、参数与输出文本之间的对应关系。

printf()函数可以接受多个参数,其第1个参数预期为一个字符串,该字符串中的占位符个数以及要求的类型应与后续其他参数相匹配,否则会产生错误。最简单的占位符由一个%加上一个specifier说明符构成,specifier说明符详见下表。

运用复杂占位符进行格式化输出

一个完整的占位符格式如下,其中,[ ]表示其中的内容为可选项。在下述格式中,从前住后依次是%标志(flags)输出宽度(width)精度(.precision)类型长度(length)以及说明符(specifier)。其中,%以及末尾的specifier都是必需的。

%[flags][width][.precision][length]specifier

specifier说明符处于一个占位符的末尾,是占位符不可或缺的组成部分,它定义了printf()函数以何种类型来解释和输出与占位符匹配的参数。

specifier/说明符输出示例
d或i有符号的十进制整数827
u无符号的十进制整数2353
o无符号八进制整数621
x无符号十六进制整数(小写)2fb
X无符号十六进制整数(大写)2FB
f或F十进制浮点小数(小写)792.45
e科学计数法(小写)7.9245e+2
E科学计数法(大写)7.9245E+2
g以%e或%f中的较短格式输出浮点数792.45
G以%E或%F中的较短格式输出浮点数792.45
a十六进制浮点数(小写)0xd.1f
A十六进制浮点数(大写)0XD.1F
c单个字符z
s字符串hello
p指针(地址)c280000000000000
n输出计数格式化输出内容为空。当前为止已格式化输出的字符总数将存储在对应的参数中,该对应参数的类型应为int*。
%两个连续的%%将会在输出结果中产生一个%。%
flags/标识描述
-在给定的输出宽度中左对齐,默认右对齐
+对于正数,前置一个+号,对负数,前置一个-号。默认情况下,负数前置一个-号,正数前无+号。
(空格)如果数值前无符号位,插入一个空格在数值前。
#与%o, %x, %X配用时,在数值前分别附加0, 0x, 0X…
0当给定输出宽度时,如果数字的字符数不够,左边补0而不是空格。
width/输出宽度描述
(number)格式化输出的最小字符宽度。如果值格式化后的宽度小于指定宽度,则以空格填充。如果值格式化后实际宽度大于指定宽度,按实际值输出。
**号表示宽度值未在格式字符串中给出,而是作为一个附加的整数值列于被格式化输出的参数之前。
.precision/精度描述
.number对于整型说明符(d, i, o, u, x, X),该精度给出了最小的输出位数大小。如果实际值小于指定位数,则在前面补0。如果实际值位数大于指定位数,按实际值输出。如果指定精度为0,意为对于值0,格式化输出结果为空。 对于a,A,e,E,f和F等浮点数输出格式,该精度值给出了小数点后的位数(默认为6)。对于g和G输出格式,该精度值规定了最大输出位数。对于s输出格式,该精度值规定了最大输出字符数。默认情况下,以0结尾的C风格字符串中的全部字符都会被输出,直到遇到表示末尾的0值字符。
**号表示精度值未在格式字符串中给出,而是作为一个附加的整数值列于被格式化输出的参数之前。

类型长度(length)项用于表示数据类型的长度。上表列出了当不同的[length]项与不同的[specifier]合用时所对应的输出参数的数据类型。

length/长度d iu o x Xf F e E g G a Acspn
(none)intunsigned intdoubleintchar*void*int*
hhsigned charunsigned charsigned char*
hshort intunsigned short intshort int*
llong intunsigned long intwint_twchar_t*long int*
lllong long intunsigned long long intlong long int*
jintmax_tuintmax_tintmax_t*
zsize_tsize_tsize_t*
tptrdiff_tptrdiff_tptrdiff_t*
Llong double

示例

格式化输出整数

示例中为方便观察,使用| |来标识输出宽度。

#include <stdio.h>

int main(){
    int i = 346, j = -346;
    printf("i = |%+d|, j = |%d|\n",i,j);
    printf("i = |%015d|, j = |%+15d|\n",i,j);
    return 0;
}

执行结果为:

i = |+346|, j = |-346|
i = |000000000000346|, j = |           -346|

格式化输出浮点数

示例中为方便观察,使用| |来标识输出宽度。

#include <stdio.h>

int main(){
    double f = 3.1415926;
    double d = -314.15926535798932;
    printf("f = |%+f|, d = |%f|\n",f,d);
    printf("f = |%-15.3f|, d = |%+15.2f|\n",f,d);
    return 0;
}

执行结果为:

f = |+3.141593|, d = |-314.159265|
f = |3.142          |, d = |        -314.16|

格式化输出字符串

示例中为方便观察,使用| |来标识输出宽度。

#include <stdio.h>

int main(){
    char s[] = "tomcat";
    printf("|%s|\n",s);
    printf("|%30s|\n",s);
    printf("|%-30s|",s);
    return 0;
}

执行结果为:

|tomcat|
|                        tomcat|
|tomcat                        |

参考资料:

  1. Cpp printf

转自

  1. printf()使用占位符精细控制输出格式–海洋饼干叔叔
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

printf使用占位符控制输出格式 的相关文章

  • Shell GNU-Screen -X 的问题

    OPTIONS java Xms1024M Xmx1024M jar craftbukkit jar PROCESS server01 screen dmS PROCESS OPTIONS nogui Starting the applic
  • 为什么这段代码会打印两次? [复制]

    这个问题在这里已经有答案了 可能的重复 Linux gcc 中 fork 的工作 https stackoverflow com questions 3513242 working of fork in linux gcc include
  • 在 C/C++ 中打印前导空格和零

    我需要在数字前打印一些前导空格和零 以便输出如下所示 00015 22 00111 8 126 在这里 我需要打印leading spaces当数字是even and leading zero when odd 我是这样做的 int i d
  • register_printf_specifier 的替代方案(使用 printf() 以二进制格式打印数字)

    据我所知 register printf specifier 现已弃用 我无法再使用 C99 编译器使用 register printf specifier 运行代码www onlinegdb com http www onlinegdb
  • 格式“%s”需要“char *”类型的参数

    为了锻炼我的 C 编程技能 我尝试自己编写 strncpy 函数 在这样做的过程中 我不断地遇到错误 最终解决了其中的大部分错误 但我却没有进一步的灵感继续下去 我收到的错误是 ex2 1 c 29 3 warning format s e
  • 添加自定义转换类型以进行字符串格式化

    python 中是否有向字符串格式添加额外的转换类型 使用的标准转换类型 基于字符串的格式化是这样的s对于字符串 d我想要做的是添加一个新字符 我可以为其指定一个自定义处理程序 例如 lambda 函数 该处理程序将返回要插入的字符串 例如
  • 在 Golang 中构建动态(条件)WHERE SQL 查询

    我正在使用 golang go reform PostgreSQL 我想做的是一个 REST 搜索实用程序 一切都很顺利 直到我遇到条件搜索查询 这里的 条件 意味着我在表中有 10 列要搜索 并且可能有大量的组合 所以我无法单独处理它们
  • “printf”仅打印变量地址

    所以这是我的代码 include
  • 使用 system.out.printf 格式化 java 字符串

    我一直在寻找很多关于 java 中的 System out printf 格式化字符串输出的问题 但我似乎不明白如何使用它 我正在尝试打印看起来像这样的漂亮专栏 601 GoPro Hero5 Black 276 95 602 GoPro
  • PHP Printf 作为浮点精度

    我正在尝试使用 PHPprintf功能打印出用户的存储容量 完整的公式看起来像这样 echo printf 02f size 1024 1024 GB 鉴于 size 10 1024 1024 这应该打印出来 10 00 GB 但事实并非如
  • 在 Perl 中我应该使用什么来代替 printf ?

    我需要在 Perl 中使用一些字符串替换来简化翻译 即替换许多 print Outputting n numbers 通过类似的东西 printf Outputting d numbers n 但是 我想用更易于人类解析的内容替换 prin
  • printf 转换 long long 时出现问题

    我一直在研究一个项目欧拉问题 该问题本质上迫使您使用具有大存储空间的数据类型 include
  • 如何使用 write 系统调用将 int 写入文件并完全按照写入方式读取它们?

    如何使用 UNIX 的 write 系统调用将 int float 或其他类型写入文件 我想这样做而不使用任何 lib 函数 例如fprintf or fwrite 我想使用文件描述符而不是FILE 再次打开后 文件必须完全按照写入的方式读
  • 如何使用 sprintf 附加字符串?

    我面临着一个严重的问题sprintf 假设我的代码片段是 sprintf Buffer Hello World sprintf Buffer Good Morning sprintf Buffer Good Afternoon 几百次冲刺
  • 格式化整数时 printf 中的精度字段

    当我执行这两行时 printf 5d n 3 use of precision filed printf 05d n 3 use of 0 flag to prepend with 0 我得到以下输出 00003 00003 结果相同 所以
  • Java中printf左对齐

    当我运行该程序时 阶乘值右对齐 有没有办法让它左对齐 同时保持中间 50 个空格 public class Exercise 5 13 public static void main String args int numbers 1 2
  • 从 CUDA 设备写入输出文件

    我是 CUDA 编程的新手 正在将 C 代码重写为并行 CUDA 新代码 有没有一种方法可以直接从设备写入输出数据文件 而无需将数组从设备复制到主机 我假设如果cuPrintf存在 一定有地方可以写一个cuFprintf 抱歉 如果答案已经
  • 字符串格式化表达式 (Python)

    字符串格式化表达式 This is d s example 1 nice 字符串格式化方法调用 This is 0 1 example format 1 nice 我个人更喜欢方法调用 第二个示例 以提高可读性 但由于它是新的 因此随着时间
  • 如何使用 sprintf 函数在字符中添加前导“0”而不是空格?

    我正在尝试使用sprintf函数为字符添加前导 0 并使所有字符长度相同 然而我得到的是领先空间 My code a lt c 12 123 1234 sprintf 04s a 1 12 123 1234 我试图得到什么 1 0012 0
  • 需要在python中找到print或printf的源代码[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在做一些我不能完全谈论的事情 我

随机推荐

  • 西门子PLC S7-200SMART Modbus TCP通讯的步骤和要点

    Modbus TCP是一个非常传统 xff0c 应用广泛的通讯协议 xff0c 很多智能设备都支持该协议 西门子S7 200SMART及1200 1500系列都免费支持 xff08 300和400还是要高昂收费 xff09 xff0c 并且
  • GPRM/GNRMC定位信息的读取与解析

    GPRM GNRMC定位信息的读取与解析 参考网址 xff1a http www cnblogs com 88223100 p GPRM GNRMC Transform html 帧头 UTC时间 状态 纬度 北纬 南纬 经度 东经 西经
  • 基于Arduino 开发 MAX30102 LM35 SSD1306 观察血氧、心率和温度血氧仪

    本项目第一版本实现在arduino框架下通过MAX30102 对血氧和心率 进行实时监控 xff0c 通过LM35 对温度进行监控 所有数值在 ssd 1306 上进行显示 在血氧低过一定数值的时 xff0c 设备会通过蜂鸣器发出警报 第二
  • Python中max函数key的用法详解

    一 背景 起源于一个问题 xff1a 怎样找到字符串中出现次数最多的字符 其实使用max函数就能很轻松的解决这个问题 xff1a 代码 xff1a str1 61 34 AAAaaa8888899sssss 34
  • 查询选修了全部课程的学生姓名

    SELECT SN FROM S WHERE NOT EXISTS SELECT FROM C WHERE NOT EXISTS SELECT FROM SC WHERE SNO 61 S SNO AND CNO 61 C CNO 今天在看
  • Android11小黄鸟安装CA证书以及解决抓包没网问题

    目录 安装CA证书解决没网解决没有system读写权限 安装CA证书 首先没有CA证书是这个样子的 1 准备一个MT管理器 2 进入到 data data com guoshi httpcanary premium cache 目录找到Ht
  • libcurl异步方式使用总结

    原文链接 xff1a https www cnblogs com Newdawn p 10051231 html libcurl这个库的同步方式很简单 xff0c 不做介绍 xff0c 而异步方式很难理解 xff0c 本博客参考官网的dem
  • 开源项目中的法律风险

    引言 写这篇博客的契机是我厂刚好开了一次这样的培训 xff0c 听了以后觉得很有收获 碰巧自己最近也在写开源项目 xff0c 因此觉得还是有必要写一下 有小伙伴提到 xff0c 这种问题 xff0c 去网上找那个指导你如何选择 LICENS
  • UTF8中文编码范围

    简介 UTF 8有点类似于Haffman编码 xff0c 它将Unicode编码为 xff1a 00000000 0000007F的字符 xff0c 用单个字节来表示 xff1b 00000080 000007FF的字符用两个字节表示 xf
  • MLO/uboot-spl.bin和uboot.img/uboot.bin

    前段时间使用TI的am4378芯片 xff0c 发现系统在SD卡启动的时候 xff0c 启动文件使用的是MLO和uboot img xff1b 而Norflash和eMMC启动的时候使用的是 uboot spl bin和uboot bin
  • 身份证校验码规则

    背景 项目中有部分功能需要验证用户身份 为了防止用户随便输入身份信息 因此要对输入数据进行验证 于是参照百科提供的规则进行了实现 公民身份号码是特征组合码 xff0c 由十七位数字本体码和一位数字校验码组成 排列顺序从左至右依次为 xff1
  • 【C语言】代码分析--条件编译及编译预处理阶段

    来自博客园 Rusty 39 s code 一 C语言由源代码生成的各阶段如下 xff1a C源程序 xff0d gt 编译预处理 xff0d gt 编译 xff0d gt 优化程序 xff0d gt 汇编程序 xff0d gt 链接程序
  • GB2132转UTF-8

    背景 单片机端常用的中文显示字符集是GB2312 相对于UTF 8表示中文时更节省空间 但是Linux端为了通用及兼容性常采用UTF 8作为字符编码 为了保持编码的的统一 网络通信时单片机内部将GB2312转为UTF 8发送给Linux 于
  • 操作系统中C程序内存分布

    memory management is one of the most important topics for a Programmer and so understanding the Memory Layout of a C Pro
  • win下使用Python获取串口列表

    背景 一个工具需要使用串口 可是计算机中有时候又不仅有一个串口接口 因此需要获取串口列表并且区分那个是串口接口 代码 span class token comment coding utf 8 span span class token k
  • Vim快捷键-键位图

    背景 嵌入式linux开发中 经常接触linux环境 最方便的莫过于使用vi 功能强大 适用范围广 因此了解一些vim中常见的命令对于日常工作学习大有裨益 针对于不同阶段 可以参考学习一下vim中的快捷键 提升工作效率 版本一 版本二 版本
  • P通道MOSFET简介

    A P Channel MOSFET is a type of MOSFET in which the channel of the MOSFET is composed of a majority of holes as current
  • Gcc编译优化等级介绍

    Gcc 编译优化简介 gcc 提供了为了满足用户不同程度的的优化需要 xff0c 提供了近百种优化选项 xff0c 用来对 编译时间 xff0c 目标文件长度 xff0c 执行效率 这个三维模型进行不同的取舍和平衡 优化的方法不一而足 xf
  • inline关键字的用法

    C代码可以在代码大小和执行时间两个方便优化 inline函数 gcc gnu org 这样描述 By declaring a function inline you can direct GCC to make calls to that
  • printf使用占位符控制输出格式

    printf 函数提供丰富的占位符参数以便精细地控制输出格式 xff0c 再进行字符操作的时候我们可能会使用到sprintf类函数进行处理 xff0c 因此这里对printf 函数的格式化输出控制进行较为 详细 讨论 简单的printf 语