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

🦄个人主页:修修修也

🎏所属专栏:程序调试及报错解决

⚙️操作环境:Visual Studio 2022

ea6fe582c4da402da6a88f7333afea20.gif


目录

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

1.前导0问题

2.域宽(输出几位数)问题

1.有时会碰到以下这种要求保留几位小数的:

2.有时我们有时又会遇到诸如打印乘法口诀表打印不齐的尴尬场景

二.数据输出转换说明,修饰符,标记,表格大全

1.转换说明及其打印的输出结果

2.printf()中的标记

3.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_t或uintmax_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_t是sizeof返回的类型(C99).

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


总结

以上,关于C语言printf()函数的输出问题就总结到这里,如果有需要的话,下期会写一篇C语言关于输入函数scanf()的详解,还望大家多多支持,共同进步!

  • 18
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

修修修也

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值