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

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

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

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()的详解,还望大家多多支持,共同进步!


相关文章
|
3月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
365 0
|
1月前
|
存储 C语言 C++
深入C语言,发现多样的数据之枚举和联合体
深入C语言,发现多样的数据之枚举和联合体
深入C语言,发现多样的数据之枚举和联合体
|
1月前
|
存储 C语言
深入C语言内存:数据在内存中的存储
深入C语言内存:数据在内存中的存储
|
1月前
|
C语言
回溯入门题,数据所有排列方式(c语言)
回溯入门题,数据所有排列方式(c语言)
|
2月前
|
C语言
C语言程序设计核心详解 第二章:数据与数据类型 4种常量详解 常见表达式详解
本文详细介绍了C语言中的数据与数据类型,包括常量、变量、表达式和函数等内容。常量分为整型、实型、字符型和字符串常量,其中整型常量有十进制、八进制和十六进制三种形式;实型常量包括小数和指数形式;字符型常量涵盖常规字符、转义字符及八进制、十六进制形式;字符串常量由双引号括起。变量遵循先定义后使用的规则,并需遵守命名规范。函数分为标准函数和自定义函数,如`sqrt()`和`abs()`。表达式涉及算术、赋值、自增自减和逗号运算符等,需注意运算符的优先级和结合性。文章还介绍了强制类型转换及隐式转换的概念。
|
3月前
|
存储 C语言
【C语言】C语言-学生成绩管理系统(源码+数据文件+课程论文)【独一无二】
【C语言】C语言-学生成绩管理系统(源码+数据文件+课程论文)【独一无二】
52 15
|
3月前
|
C语言
【C语言】在限制定条件下数据移动
【C语言】在限制定条件下数据移动
38 1
|
3月前
|
存储 C语言
【C语言】C语言-设备管理系统(源码+数据文件)【独一无二】
【C语言】C语言-设备管理系统(源码+数据文件)【独一无二】
104 4
|
3月前
|
存储 小程序 C语言
C语言数据的存储(内含百度笔试题)
C语言数据的存储(内含百度笔试题)
41 4
|
3月前
|
存储 数据可视化 C语言
【C语言】C语言 手机通讯录系统的设计 (源码+数据+论文)【独一无二】
【C语言】C语言 手机通讯录系统的设计 (源码+数据+论文)【独一无二】