Windows中文网

 找回密码
 立即注册
搜索
查看: 6567|回复: 0

printf格式化输出函数用法详解

[复制链接]

19

主题

22

帖子

428

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
428
发表于 2022-5-15 10:57:13 | 显示全部楼层 |阅读模式

格式字符串由以下形式的可选和必需字段组成:

%[flags][width][.precision][size]type

格式字符串中的每个字段都是一个用于指定格式选项或转换说明的字符(或数字)。必需的type字段用于指定参数的转换类型;可选的flags、width和precision字段用于控制格式的其他选项(例如前导空格或前导零、对齐方式、显示宽度和显示精度等),可选的size字段用于指定参数的大小。

type字段

type字段(称为类型转换说明符,或类型字符)出现在任何可选字段之后,用于指定将相应的参数解释为字符、字符串、指针、整数或浮点数等。类型字符所对应的参数类型和输出格式如下表所示:

  
type
  
  
参数类型
  
  
输出格式
  
  
c
  
  
字符
  
  
当与printf函数一起使用时,指定一个单字节字符;当与wprintf函数一起使用时,指定一个宽字符
  
  
C
  
  
字符
  
  
当与printf函数一起使用时,指定一个宽字符;当与wprintf函数一起使用时,指定一个单字节字符
  
  
d
  
  
整数
  
  
有符号十进制整数
  
  
u
  
  
整数
  
  
无符号十进制整数
  
  
o
  
  
整数
  
  
无符号八进制整数
  
  
x
  
  
整数
  
  
无符号十六进制整数(小写)
  
  
X
  
  
整数
  
  
无符号十六进制整数(大写)
  
  
e
  
  
浮点数
  
  
格式为[-]d.dddde±dd[d]的有符号浮点数,其中d是一位十进制数字,dddd是一位或多位十进制数字(具体取决于指定的精度,或者默认为六位),dd[d]是两位或三位十进制数字(具体取决于输出格式和指数的大小)
  
  
E
  
  
浮点数
  
  
与e相同,只是格式中使用大写的E,即[-]d.ddddE±dd[d]
  
  
f
  
  
浮点数
  
  
格式为[-]dddd.dddd的有符号浮点数,dddd是一位或多位十进制数字,小数点前的位数取决于实际数值的大小,小数点后的位数取决于指定的精度(默认为六位)
  
  
F
  
  
浮点数
  
  
与f相同,除了infinity和nan输出为大写(分别表示无穷数和非数)
  
  
g
  
  
浮点数
  
  
以f或e格式显示的有符号浮点数,对于给定的浮点数,会选择两者(f或e)之中更紧凑的一个格式来显示。只有当指数小于-4或大于或等于指定的精度时,才会使用e格式。使用f格式时,只有在小数点后面确实有一位或多位非零数字时才会显示小数点及后续数字,否则截断小数点及后面的零
  
  
G
  
  
浮点数
  
  
与g相同,只是格式中使用大写的E(在使用e格式的情况下)
  
  
a
  
  
浮点数
  
  
有符号的十六进制双精度浮点数,格式为[-]0xh.hhhhp±dd,其中h.hhhh是小写的十六进制数字,dd是一位或多位十进制数字的指数
  
  
A
  
  
浮点数
  
  
有符号的十六进制双精度浮点数,格式为[-]0Xh.hhhhP±dd,其中h.hhhh是大写的十六进制数字,dd是一位或多位十进制数字的指数
  
  
n
  
  
指向整数的指针
  
  
Number of  characters that are successfully written so far to the stream or buffer. This  value is stored in the integer whose address is given as the argument. The  size of the integer pointed at can be controlled by an argument size  specification prefix. The n specifier is disabled by default; for information  see the important security note.
  
相应的实参必须是指向int型对象的指针,在该对象中保存printf函数调用已经输出的字符数量,不产生输出
  
  
p
  
  
指针
  
  
显示为十六进制数字的地址值
  
  
s
  
  
字符串
  
  
与printf函数一起使用时,指定一个单字节或多字节字符串;与wprintf函数一起使用时,指定一个宽字符串。字符显示到第一个空字符或达到精度字段指定的值
  
  
S
  
  
字符串
  
  
与printf函数一起使用时,指定一个宽字符串;与wprintf函数一起使用时,指定一个单字节或多字节字符串。字符显示到第一个空字符或达到精度字段指定的值
  
  
Z
  
  
ANSI_STRING或UNICODE_STRING结构
  
  
当使用ANSI_STRING或UNICODE_STRING结构的地址作为参数时,显示结构的Buffer字段指向的缓冲区中包含的字符串。如果要显示UNICODE_STRING结构中包含的宽字符串,还应该同时指定size字段,例如%wZ;如果要显示ANSI_STRING结构中指向的单字节或多字节字符串,也应该同时指定size
  
字段,例如%hZ。类型字符Z通常用于驱动程序调试函数,例如DbgPrint和KdPrint
  

Z以及c、C、s和S类型字符与printf / wprintf函数一起使用时的行为是Microsoft扩展。按照ISO C标准,所有格式化函数将c和s用于单字节(或多字节)字符和字符串,将C和S用于宽字符和字符串。

flags字段

flags字段(也称为标志字符)用于指定输出结果的对齐方式并控制符号、空格、前导零、小数点以及八进制和十六进制前缀的输出。可以同时指定多个标志字符,而且可以以任意顺序出现。标志字符及其对应的含义如下表所示:

  
flag
  
  
含义
  
  
默认
  
  
-
  
  
将输出结果在width字段指定的宽度范围内左对齐
  
  
右对齐
  
  
0
  
  
在输出结果的前面添加前导零,直到达到width字段指定的宽度。如果同时出现0和-,0将被忽略
  
  
不使用前导零进行填充
  
  
+
  
  
如果输出值是有符号类型,则使用符号(+或-)作为输出值的前缀
  
  
只对有符号的负值显示符号(-)前缀
  
  
空格(' ')
  
  
如果输出值有符号且为正数,则使用空格作为输出值的前缀。如果同时出现空格和+,则忽略空格
  
  
不使用空格作为前缀
  
  
#
  
  
与类型字符o、x或X一起使用时,分别使用0、0x或0X作为非零输出值的前缀
  
  
不使用进制前缀
  
  
与类型字符e、E、f、F、a或A一起使用时,强制输出值包含小数点
  
  
小数点只有在后面有数字时才出现
  
  
与类型字符g或G一起使用时,强制输出值包含小数点,并防止截断尾部的零
  
  
小数点只有在后面有数字时才出现,尾部的零会被截断
  

width字段

width字段指定为一个非负的十进制整数,用于控制输出的宽度(最小字符数)。如果输出结果中的字符数小于指定的宽度,会在输出结果的左侧或右侧添加空格(取决于是否指定了左对齐标志,即标志字符-),直到达到最小宽度。如果指定了标志字符0,会在输出结果的前面添加前导零,直到达到最小宽度。

如果指定的width字段值较小,也不会导致输出结果被截断,当实际需要输出的字符数大于指定的宽度或者没有指定宽度时,输出结果中的所有字符都会被安全输出。

precision字段

precision(精度)字段由一个句点(.)后跟一个非负十进制整数组成,根据type字段的转换类型,该非负十进制整数指定要输出的字符串字符数、有效位数或小数位数。与width字段不同,precision字段可能会导致输出结果的截断或对浮点值进行四舍五入。

如果没有指定precision字段,由类型字符确定精度的解释或默认精度,如下表所示。

  
type
  
  
含义
  
  
默认
  
  
c、C
  
  
不受精度影响
  
  
打印字符
  
  
s、S
  
  
精度指定要打印的最大字符数,超过精度的字符不会被打印
  
  
打印字符,直到遇到空字符
  
  
d、u、o、x、X
  
  
精度指定要打印的最小位数。如果参数中的位数小于精度,则在输出值的左侧填充0;当实际位数超过精度时,输出值不会被截断
  
  
默认精度为1
  
  
e、E、f、F
  
  
精度指定要在小数点后打印的位数,数值是四舍五入的。如果精度指定为0或句点(.)的后面没有指定精度数字,则不打印小数点
  
  
默认精度为6
  
  
g、G
  
  
精度指定要打印的最大有效位数
  
  
打印六个有效数字,所有末尾的零都被截断
  
  
a、A
  
  
精度指定要在小数点后打印的位数。如果精度指定为0或句点(.)的后面没有指定精度数字,则不打印小数点
  
  
默认精度为13
  

width字段和precision字段都可以指定为一个*号。例如“%*d”,表示width字段由参数列表中的一个整型参数提供,这个整型参数应该位于与类型字符d对应的那个整型参数之前。再例如“%*.*f”,应该在与类型字符f对应的那个浮点型参数之前提供表示width字段和precision字段的整型参数。程序应该按照欲输出参数的具体值确定合理的width字段和precision字段的整型参数值,示例如下:

  
printf("%0*d", 5, 3);                // 输出:00003
  
printf("%*.*f", 8, 3, 3.14159265);  // 输出:3.142
  

scanf函数中*的用法有所不同,把*放在%和类型字符之间时,会使得scanf函数跳过相应的输入项,这个特性通常用于需要读取输入中特定列的内容时。示例如下:

  
int i;
  
scanf("%*d %*d %d", &i);            // 假设输入:111 222 333
  
printf("%d", i);                    // 输出:333
  


size字段

size字段(大小前缀)是type字段的参数大小修饰符。hh、h、j、l(小写L)、L、ll、t、w、z、I(大写i)、I32和I64等前缀用于指定相应参数的大小,long或short、32位或64位、单字节字符或宽字符等。具体的参数类型应该使用的大小前缀和类型字符如下表所示。

  
若要指定
  
  
使用前缀
  
  
使用类型字符
  
  
signed char、unsigned  char
  
  
hh
  
  
d、u、o、x或X
  
  
short int、unsigned  short int
  
  
h
  
  
d、u、o、x或X
  
  
__int32、unsigned __int32
  
  
I32
  
  
d、u、o、x或X
  
  
__int64、unsigned __int64
  
  
I64
  
  
d、u、o、x或X
  
  
intmax_t、uintmax_t
  
  
jI64
  
  
d、u、o、x或X
  
  
long int、unsigned  long int
  
  
l(小写L)
  
  
d、u、o、x或X
  
  
long long int、unsigned  long long int
  
  
ll(小写LL)
  
  
d、u、o、x或X
  
  
ptrdiff_t
  
  
tI(大写i)
  
  
d、u、o、x或X
  
  
size_t
  
  
zI(大写i)
  
  
d、u、o、x或X
  
  
long double
  
  
l(小写L)或L
  
  
e、E、f、F、g、G、a或A
  
  
单字节字符
  
  
h
  
  
c或C
  
  
宽字符
  
  
l(小写L)或w
  
  
c或C
  
  
单字节或多字节字符串
  
  
h
  
  
s、S或Z
  
  
宽字符串
  
  
l(小写L)或w
  
  
s、S或Z
  

I(大写i)、I32、I64和w前缀是Microsoft扩展,与char类型一起使用时的h前缀和与double类型一起使用时的l(小写L)前缀也是Microsoft扩展,与ISO C不兼容。

如果没有指定大小前缀,格式化函数将整数参数(例如,有符号或无符号的char、short、int、long、long long和枚举类型)作为32位整数类型,将浮点参数(例如,float、double和longdouble)作为64位双精度类型。


回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

QQ|Archiver|手机版|小黑屋|Windows中文网 ( 鲁ICP备2021014210号 )

GMT+8, 2025-6-9 18:35 , Processed in 0.080213 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表