【C语言】数据输出的域宽控制(如何在输出数据时控制0占位)(如何输出前导0)(保留几位小数)(乘法口诀表打印不齐)等问题

举报
修修修也 发表于 2024/03/30 15:10:34 2024/03/30
【摘要】 如何一站式解决前导0问题,打印小数位数问题,乘法口诀表对不齐问题等一系列有关于C语言printf()的输出问题。关于printf()函数,你想知道的都在这里!

一.常见输出问题及解决办法

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()的修饰符

修饰符

含义

标记

标记见表3,其中介绍了5种标记(-,+,空格,#和0),可以不使用标记或使用多个标记。      

如:"%-10d"

数字

最小字段宽度

如果该字段不能容纳待打印的数字或字符串,系统会使用更宽的字符段。

如:"%4d"

.数字

精度

对于%e,%E,和%f转换,表示小数点右边数字的位数

对于%g和%G转换,表示有效数字最大位数

对于%s转换,表示待打印字符的最大数量

对于整形转换,表示待打印数字的最小位数

如有必要,使用前导0来达到这个位数

只使用.表示其后跟随一个0,所以%.f和%.0f相同

如:"%5.2f"打印一个浮点数,字段宽度为5字符,其中小数点后有两位数字。

h

和整形转换说明一起使用,表示short int或unsigned short int类型的值。

如:"%hu","%hx","%6.4hd"

hh

和整形转换说明一起使用,表示short char或unsigned char类型的值。

如:"%hhu","%hhx","%6.4hhd"

j

和整形转换说明一起使用,表示intmax_tuintmax_t类型的值。这些类型定义在stdint.h

如:"%jd","%8jx"

l

和整形转换说明一起使用,表示long int或unsigned long int类型的值。

如:"%ld","%8lu"

ll

和整形转换说明一起使用,表示long long int或unsigned long long int类型的值。(C99)

如:"%lld","%8llu"

L

和浮点转换说明一起使用,表示long double类型的值。

如:"%Ld","%10.4Le"

t

和整形转换说明一起使用,表示ptrdiff_t类型的值。ptrdiff_t是两个指针差值的类型(C99)。

如:"%td","%12ti"

z

和整形转换说明一起使用,表示size_t类型的值。size_tsizeof返回的类型(C99).

如:"%zd","%12zd"



以上,关于C语言printf()函数的输出问题就总结到这里,还望大家多多支持,共同进步!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。