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) |
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 */
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 }
输出的第一行显示,使用%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个长整数。
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中的输出结果为:
程序使用 m=printf(...) 与 n=printf(...),该语句执行两项任务:打印信息和对变量赋值。注意计数针对所有的打印字符,包括空格和不可见的换行字符(不包括字符串的空字符)。
原文链接: https://www.cnblogs.com/wjtang/archive/2012/09/25/2702151.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/63724
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!