900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > C语言printf()格式化输出

C语言printf()格式化输出

时间:2022-02-25 23:16:30

相关推荐

C语言printf()格式化输出

printf()函数

请求printf()函数打印数据的指令要与待打印数据的类型相匹配。例如,打印整数时使用%d,打印字符时使用%c。这些符号被称为转换说明(conversion specification),它们指定了如何把数据转换成可显示的形式。

常用输出格式化转换说明:

* %a 浮点数、十六进制数* %A 浮点数、十六进制数* %c 单个字符* %d 有符号十进制整数* %e 浮点数、e记数法* %E 浮点数、e记数法* %f 浮点数、十进制记数法* %g 根据值的不同自动选择%f或%e* %i 与%d相同* %o 无符号八进制整数* %p 指针* %s 字符串* %u 无符号十进制整数* %x 无符号十六进制整数,使用十六进制数of* %X 无符号十六进制整数,使用十六进制数OF* %% 打印一个百分号

printf()函数的格式:

printf( 格式字符串, 待打印项1, 待打印项2,...);

注:格式字符串中的转换说明一定要与后面的每个项相匹配

printf("Farewell! thou art too dear for my possessing,\n");printf("%c%d\n", '$', 2 * cost);

待打印列表的第1个项是一个字符常量,不是变量;第2个项是一个乘法表达式。这说明printf()使用的是值,无论是变量、常量还是表达式的值。

printf()的转换说明修饰符

说明:在%和转换字符之间插入修饰符可修饰基本的转换说明。

标记

代码示例

/* width.c -- 字段宽度 */#include <stdio.h>#define PAGES 959int main(void){printf("*%d*\n", PAGES);printf("*%2d*\n", PAGES);printf("*%10d*\n", PAGES);printf("*%-10d*\n", PAGES);return 0;}

运行结果:

第1个转换说明%d不带任何修饰符,其对应的输出结果与带整数字段宽度的转换说明的输出结果相同。在默认情况下,没有任何修饰符的转换说明,就是这样的打印结果。

第2个转换说明是%2d,其对应的输出结果应该是2字段宽度。因为待打印的整数有3位数字,所以字段宽度自动扩大以符合整数的长度。

第3个转换说明是%10d,其对应的输出结果有10个空格宽度,实际上在两个星号之间有7个空格和3位数字,并且数字位于字段的右侧。

最后一个转换说明是%-10d,其对应的输出结果同样是10个空格宽度,-标记说明打印的数字位于字段的左侧。熟悉它们的用法后,我们就能很好地控制输出格式。试着改变PAGES的值,看看编译器如何打印不同位数的数字。

// floats.c -- 一些浮点型修饰符的组合#include <stdio.h>int main(void){const double RENT = 3852.99; // const变量printf("*%f*\n", RENT);printf("*%e*\n", RENT);printf("*%4.2f*\n", RENT);printf("*%3.1f*\n", RENT);printf("*%10.3f*\n", RENT);printf("*%10.3E*\n", RENT);printf("*%+4.2f*\n", RENT);printf("*%010.2f*\n", RENT);return 0;}

运行结果:

本例的第1个转换说明是%f。在这种情况下,字段宽度和小数点后面的位数均为系统默认设置,即字段宽度是容纳待打印数字所需的位数和小数点后打印6位数字。

第2个转换说明是%e。默认情况下,编译器在小数点的左侧打印1个数字,在小数点的右侧打印6个数字。这样打印的数字太多!解决方案是指定小数点右侧显示的位数,程序中接下来的4个例子就是这样做的。请注意,第4个和第6个例子对输出结果进行了四舍五入。另外,第6个例子用E代替了e。

第7个转换说明中包含了+标记,这使得打印的值前面多了一个代数符号(+)。0标记使得打印的值前面以0填充以满足字段要求。注意,转换说明%010.2f的第1个0是标记,句点(.)之前、标记之后的数字(本例为10)是指定的字段宽度。

/* flags.c -- 演示一些格式标记 */#include <stdio.h>int main(void){printf("%x %X %#x\n", 31, 31, 31);printf("**%d**% d**% d**\n", 42, 42, -42);printf("**%5d**%5.3d**%05d**%05.3d**\n", 6, 6, 6, 6);return 0;}

运行结果:

第1行输出中,1f是十六进制数,等于十进制数31。第1行printf()语句中,根据%x打印出1f,%X打印出1F,%#x打印出0x1f。

第2行输出演示了如何在转换说明中用空格在输出的正值前面生成前导空格,负值前面不产生前导空格。这样的输出结果比较美观,因为打印出来的正值和负值在相同字段宽度下的有效数字位数相同。

第3行输出演示了如何在整型格式中使用精度(%5.3d)生成足够的前导0以满足最小位数的要求(本例是3)。然而,使用0标记会使得编译器用前导0填充满整个字段宽度。最后,如果0标记和精度一起出现,0标记会被忽略。

/* stringf.c -- 字符串格式 */#include <stdio.h>#define BLURB "Authentic imitation!"int main(void){printf("[%2s]\n", BLURB);printf("[%24s]\n", BLURB);printf("[%24.5s]\n", BLURB);printf("[%-24.5s]\n", BLURB);return 0;}

运行结果:

注意,虽然第1个转换说明是%2s,但是字段被扩大为可容纳字符串中的所有字符。还需注意,精度限制了待打印字符的个数。.5告诉printf()只打印5个字符。另外,-标记使得文本左对齐输出。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。