格式化输出函数 printf()

1.printf()函数的四种用法

printf("字符串");

printf("输出控制符",输出参数);

printf("输出控制符1 输出控制符2 ……", 输出参数1, 输出参数2,……);

printf("输出控制符 非输出控制符", 输出参数);

2.输出控制符

2.1输出控制符:转换说明符

转换说明符 输 出
%a,%A 浮点数、十六进制数字和 p-计数法/P-计数法(C99)
%c 一个字符
%d 有符号十进制整数
%e,%E 浮点数、e-计数法/E-计数法
%f 浮点数、十进制计数法
%g,%G 根据数值的不同自动选择%f 或 %e/%E;

%e/%E格式在指数小于 -4 或大于等于精度时使用

%i有符号十进制整数(与%d 相同)
%o无符号八进制整数
%p指针
%s字符串
%u无符号十进制整数
%x,%X使用十六进制数字 0f/0F 的无符号十六进制整数
%%打印一个 %

2.2输出控制符:转换说明修饰符

修饰符意 义
标志五种标志(- 、+、 空格 、# 和0)。可以使用零个或者多个标志

示例:"%-10d"

digit(s)字段宽度的最小值。如果该字段不能容纳要打印的数或者字符串,系统就会使用更宽的字段

示例:"%4d"

.digit(s)

(有个小数点)

精度。对于%e、%E 和 %f 转换,是将要在小数点的右边打印的数字的位数。对于%g和%G

转换,是有效数字的最大位数。对于%s 转换,是将要打印的字符的最大数目。对于整数转换,

是将要打印的数字的最小位数:如果必要,要使用前导零来达到这个位数。只是用 "." 表示其后

跟随一个零,所以 %.f 与 %.0f相同

示例: "%5.2f" 打印一个浮点数,它的字段宽度为5个字符,小数点后有2个数字。

h和整数转换说明符一起使用,表示一个 short int 或 unsigned short int 类型数值

示例:"%hu" "%hx" "%6.4hd"

hh和整数转换说明符一起使用,表示一个 signed char 或 unsigned char 类型数值

示例:"%hhu" "%hhx" "%6.4hhd"

j和整数转换说明符一起使用,表示一个 intmax_t 或 uintmax_t 值

示例:"%jd" "%8jX"

l

(字母)

和整数转换说明符一起使用,表示一个 long int 或 unsigned long int 类型值

示例:"%ld" "%8lu"

ll和整数转换说明符一起使用,表示一个 long long int 或 unsigned long long int 类型值

示例:"%lld"

L浮点转换说明符一起使用,表示一个 long double 值

示例:"%Lf" "%Le"

t和整数转换说明符一起使用,表示一个ptrdiff_t 值(与两个指针之间的差相对应的类型)(C99)
z和整数转换说明符一起使用,表示一个 size_t 值(sizeof 返回的类型)(C99)

printf()格式说明符例子:
复制代码

1 /*printf()格式说明符使用的例子*/
 2 #include<stdio.h>
 3 int main(void)
 4 {
 5     unsigned int un=3000000000; // int 为32位
 6     short end=200;
 7     long big=65537;
 8     long verybig=12345678908642;
 9 
10     printf("un=%u and not %dn",un,un);
11     printf("end=%hd and %dn",end,end);
12     printf("big=%ld and not %hdn",big,big);
13     printf("verybig=%lld and not %ldn",verybig,verybig);
14     
15     return 0;
16 }
17 
18 /*
19     Vc++6.0不支持long long类型
20     将 verybig的类型改为long long型将会报错
21 */

复制代码
在Vc++6.0中的输出结果为:

格式化输出函数 printf()

2.3 printf()的标志

特别注意:如何使输出的字符前面显示'+''-'号:例如 %+6.2f,"+"表示有符号的值若为正,则显示带加号的符号,若为负则带减号的符号。

标志 意 义
- 项目是左对齐的:也就是说,会把项目打印在字段的左侧开始处

示例:"%-20s"

+有符号的值若为正,则显示带加号的符号;若为负,则带减号的符号

示例:"%+6.2f"

(空格)有符号的值若为正,则显示带前导空格(不显示符号);若为负,则带减号符号。

+ 标志会覆盖空格标志

示例:"% 6.2f"

#使用转换说明的可选形式。若为%o 格式,则以0开始;若为%x/%X格式,则以

0x/0X 开始。对于所有的浮点形式,# 保证了即使不跟任何数字,也打印一个小数

点字符。对于%g/%G格式,它防止尾随零被删除

示例:"%#o" "%#8.0f" "%+#10.3E"

0对于所有的数字格式,用前导0而不是用空格填充字段宽度。如果出现 - 标志或者

指定了精度(对于整数)则忽略该标志

示例:"%010d" "%08.3f"

3.匹配printf()说明符的类型

使用printf()语句时,切记每个要显示的值都必须对应自己的格式说明符,并且显示值的类型要同说明符匹配。
复制代码

1 /*不匹配的浮点数转换*/
 2 #include <stdio.h>
 3 
 4 int main(void)
 5 {
 6     float n1 = 3.0;
 7     double n2 = 3.0;
 8     long n3 = 2000000000;
 9     long n4 = 1234567890;
10 
11     printf("%.1e %.1e %.1e %.1en", n1, n2, n3, n4);
12     printf("%ld %ldn", n3, n4);
13     printf("%ld %ld %ld %ldn", n1, n2, n3, n4);
14     printf("%ld %ld %ld %ldn", n3, n4, n1, n2);
15 
16     return 0;
17 }

复制代码
在Vc++6.0中的输出结果为:

格式化输出函数 printf()

输出的第一行显示,使用%e 说明符并没有把整数转换成浮点数。说明%e 说明符使 printf()函数期望一个double类型值,在本系统这是一个8字节的值。当printf()查看n3 (在本系统中它是一个4字节值)时,它也查看邻近的4个字节,因此,它查看了一个8字节的单元,其中只有一部分是真正的n3 。接着,它把该单元内的位解释成一个浮点数。所以即使n3 的位数正确,在%e 和 %ld 的作用下它们的解释也是不同的,最终结果是无意义的。

第一行也说明当被用作 printf()函数的参数时,float 被转换成 double。

输出的第二行显示,如果使用的说明符正确,printf()就可以正确打印 n3 和 n4 。

输出的第三行和第四行显示,如果 printf()语句在其他地方出现不匹配错误,即使正确的说明符也会产生虚假的结果。失败过程的确切细节是依赖于实现的,详见下面的参数传递的原理。

4.参数传递的原理

函数调用如下: printf("%ld, %ld, %ld, %ldn", n1, n2, n3, n4);

该调用告诉计算机把变量n1、n2、n3、n4的值传递给计算机,计算机把它们放置到被称为堆栈(stack)的一块内存区域中来实现。计算机根据变量的类型而非转换说明符把这些值放到堆栈中。所以,n1 在堆栈中占用8个字节(float 被转换成 double)。同样,n2 也占用8个字节,而n3 和n4 则分别占用4个字节。然后控制转移到 printf()函数。该函数从堆栈把值读出来,但是在读出时,它根据转换说明符去读。 %ld 说明符指出, printf() 应该读取4个字节,所以 printf()在堆栈中读取前4个字节作为它的第一个值。这就是n1的前半部分,它被解释成一个长整数。下一个 %ld说明符再读取4个字节,这就是n1 的后半部分,它被解释成第二个长整数。同样,%ld 的第三个和第四个实例使得 n2 的前半部分和后半部分被读出,并被解释成2个长整数。

格式化输出函数 printf()

5.printf()函数的返回值

printf()的返回值是其打印输出用途的附带功能,通常很少被用到。

1 #include <stdio.h>
 2 
 3 int main(void)
 4 {
 5     int i = 212;
 6     int m, n;
 7 
 8     m = printf("%dF is water's boiling point.n", i);
 9     n = printf("%dF is water's boiling point.nn", i);
10     printf("The m = printf() function printed %d characters.n", m);
11     printf("The n = printf() function printed %d characters.n", n);
12 
13     return 0;
14 }

在Vc++6.0中的输出结果为:

格式化输出函数 printf()

程序使用 m=printf(...) 与 n=printf(...),该语句执行两项任务:打印信息和对变量赋值。注意计数针对所有的打印字符,包括空格和不可见的换行字符(不包括字符串的空字符)。



原文链接: https://www.cnblogs.com/wjtang/archive/2012/09/25/2702151.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/63724

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 上午11:06
下一篇 2023年2月9日 上午11:07

相关推荐