一.常见输出问题及解决办法
1.前导0问题
通常我们在日常输出数据时会遇到以下情况:
如图,下图是一个日期格式转换的输入输出样例:
这题代码逻辑比较简单,就是变换一下输出顺序,代码如下:
#include<stdio.h> int main() { int year = 0; int month = 0; int day = 0; scanf("%d-%d-%d", &month, &day, &year); printf("%d-%d-%d", year, month, day); return 0; }
但当这样提交时,题目会报错:
问题就出在,当我们输入“03”这样的数据时,在输出时会被编译器自动转换成“3”,造成该数据没有前导0,进而导致题目出错。
而有关前导0的解决方法也非常简单,那就是用下面这个格式来输出数据:
printf("%d-%02d-%02d", year, month, day);
即在月日的打印数据指令间加上“02”即可。
其中“0”是printf()中的一种标记,其含义为:对于数值格式,用前导0代替空格填充字段宽度。对于整数格式,如果出现-标记或指定精度,则忽略该标记。
而其中的“2”为该数据输出时的最小字段宽度,如果为2,则输出2位数字(即假若原本输出结果为3,则会输出03),4则输出4位数字(假若原本输出数据为15,则会输出0015)。
简单来讲,前导0的作用就是当原数据不能达到限定的位数时,系统自动在前面补0补齐限定的位数。
2.域宽(输出几位数)问题
1.有时会碰到以下这种要求保留几位小数的:
这就涉及C语言输出的域宽控制了,如果只对小数点后保留的位数有要求,那么只需要在打印数据指令中加上”.n“(n为你期望保留的小数位数)即可。如想要保留两位小数打印数据指令就写”%.2f“。因此该题的正确输出语句如下:
printf("sum = %.2f; average = %.2f",total,average);
2.有时我们有时又会遇到诸如打印乘法口诀表打印不齐的尴尬场景
如用以下代码打印乘法口诀表时,我们在输出语句后打印了三个空格:
#include<stdio.h> int main() { int i = 0; int n = 0; for (i = 1; i <= 9; i++) { for (n = 1; n <= i; n++) { printf("%d*%d=%d ", i, n, i * n); } printf("\n"); } return 0; }
而输出结果却是这样,非常不整齐不美观:
因此我们可以通过限定打印指令的最小字段宽度来解决这个尴尬的问题,即将输出语句改为:
printf("%d*%d=%2d ",i,n,i*n);
这样最后两数乘的结果就会固定占用两位数,就解决了之前对不齐的尴尬状况了:
当然,可以看到,图中不满两位数的数字都是默认向右对齐,空出左边的一格的,如果我们想要输出的数字都统一向左对齐,也很简单,借用printf()函数中的”-“标记符即可,它的作用就是让待打印项向左对齐,因此输出语句改为:
printf("%d*%d=%-2d ",i,n,i*n);
改后,效果如下,可以看到数字都转换为向左对齐了:
同理,像这样的printf()函数的修饰符或是标记还有很多,以上只是列举了几种比较常用的且容易给新手造成困惑,下面是整理出来的关于printf()函数的所有相关数据转换说明,修饰符,标记。都
在下面的表格里,有需要的兄弟可以收藏一下,以备不时之需。
二.数据输出转换说明,修饰符,标记,表格大全
1.转换说明及其打印的输出结果
转换说明及其打印的输出结果
转换说明 | 输出 |
%a | 浮点数,十六进制数和p计数法(C99/C11) |
%A | 浮点数,十六进制数和p计数法(C99/C11) |
%c | 单个字符 |
%d | 有符号十进制整数 |
%e | 浮点数,e计数法 |
%E | 浮点数,e计数法 |
%f | 浮点数,十进制计数法 |
%g | 根据值的不同,自动选择%f或%e。%e格式用于指数小于-4或者大于或等于精度时 |
%G | 根据值的不同,自动选择%f或%E。%E格式用于指数小于-4或者大于或等于精度时 |
%i | 有符号十进制整数(与%d相同) |
%o | 无符号八进制整数 |
%p | 指针 |
%s | 字符串 |
%u | 无符号十进制整数 |
%x | 无符号十六进制整数,使用十六进制数0f |
%X | 无符号十六进制整数,使用十六进制数0F |
%% | 打印一个百分号 |
显示详细信息
2.printf()中的标记
printf()中的标记
标记 | 含义 |
- | 待打印项左对齐。即,从字段的左侧开始打印该项项 如:"%-20s" |
+ | 有符号值若为正,则在值前面显示加号;若为负,则在值前面显示减号+标记覆盖一个空格。 如:"%+6.2f" |
空格 | 有符号值若为正,则在值前面显示前导空格(不显示任何符号);若为负,则在值前面显示减号+标记覆盖一个空格。 如:"% 6.2f" |
# | 把结果转换为另一种形式。如果是%o格式,则以0开始;如果是%x或%X格式,则以0x或0X开始;对于所有的浮点格式,#保证了即使后面没有任何数字,也打印一个小数点字符。对于%g和%G格式,#防止结果后面的0被删除。 如:"%#o","%#8.0f","%+#10.3e" |
0 | 对于数值格式,用前导0代替空格填充字段宽度。对于整数格式,如果出现-标记或指定精度,则忽略该标记。
|
显示详细信息
3.printf()的修饰符
printf()的修饰符
|
显示详细信息
以上,关于C语言printf()函数的输出问题就总结到这里,如果有需要的话,下期会写一篇C语言关于输入函数scanf()的详解,还望大家多多支持,共同进步!