700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > C方式格式化输出(printf 函数详解)

C方式格式化输出(printf 函数详解)

时间:2024-01-25 16:16:13

相关推荐

C方式格式化输出(printf 函数详解)

本篇将重点介绍C语言的格式化输出函数 printf。当然该函数在C++程序中也可以使用。

目录

printf 函数构成及标准函数语句

格式字符种类的介绍

printf 函数的具体细节实现

格式符数量与输出表列不匹配

printf 返回值问题

格式控制符 / 附加格式控制符 的位置

其他需要注意的细节

printf 函数构成及标准函数语句

printf ( 格式控制,输出表列 )

这里格式控制指又包含了格式说明和普通字符。格式说明多用于变量,以 %+格式字符 的形式,表示按照格式输出;普通字符就按照原样输出即可。

这里要注意的是,转义符在格式控制中作为普通字符,输出的是转义符转义后的字符。(如 \x21 输出的就是感叹号 !,\n 输出的就是换行)

输出表列指真正输出的数据,这个数据可以是变量、常量,也可以是表达式或是函数等。

举个栗子:

int a=10;printf("%dxX\n",a);

这段代码中 "%dxX\n" 就是格式控制,其中%d是一个格式说明,说明了这里要输出的一个数据的格式是十进制整数(格式字符 d 表示带符号的十进制整数,有关内容后面会重点说明),而后面的xX是两个普通字符,\n 属于普通字符表示换行。输出表列中的 a 与格式控制中的 %d 对应,所以在 %d 位置的实际输出就是这个 a 表示的数字10

最终输出为:

10xX

(还有一个空行)

格式字符种类的介绍

格式字符分为两种基本格式字符和附加格式字符。基本格式字符如下表:

可以用以下代码加以验证:

int m = 10;printf("%d %o %x %u\n", m, m, m, m); //输出:10 12 a 10double b = 3.1415;printf("%f %e %g\n", b, b,b);//输出:3.141500 3.141500e+00 3.1415char s[] = "abcd";char c = '*';printf("%s %c\n", s, c);//输出:abcd *

除此以外,printf 函数还具有一些附加格式字符,具体如下表:

我们可以对上一段代码加以修饰,查看结果:

int a = 10;printf("%d %-5o %x %u\n", a, a, a, a);//输出:10 12 a 10double b = 3.1415;printf("%.2f %.3e %g\n", b, b,b);//输出:3.14 3.142e+00 3.1415char s[] = "abcd";char c = '*';printf("%.2s %c\n", s, c);//输出:ab *

printf 函数的具体细节实现

接下来将介绍这个函数使用的具体细节和主要注意点。

格式符数量与输出表列不匹配

在上面的讨论中我们总是保持格式符数量和输出表列保持一致,使输出正确。但是如果两者数量不匹配,会产生什么结果?我们要分两种情况讨论。

首先是格式符数量小于输出表列数量:

int a=10,b=20;printf("%d",a,b); //格式控制%d只有一个,而输出表列却有两个a、b/* 输出只有一个数字,且为前一个:10 */

其次是格式符数量大于输出表列数量:

int a=10,b=20;printf("%d %d %d",a,b); //格式控制%d有三个,而输出表列却只有两个a、b/* 正确输出a、b的值,多出一个输入为不可信的随机值 */

所以规律可以总结为下表:

printf 返回值问题

printf 作为一个函数也有返回值,它的返回值为实际输出的字符总数量(包括换行和空格等)。这里需要注意的是,在输出表列中的一个数输出可能有很多位,比如仅仅需要输出一个 int 型变量a,a的值为1000,但是返回值为4,因为1000虽然是一个数但是有4位。具体实例代码如下:

int a=1000;int ret=printf("%d \n",a); //输出 1000(空格+换行)printf("%d",ret);/* 输出6(4位数字+1空格+1换行) */

再提醒一下,最容易忽视的两点是:①一个数字可能会有多位,不要当作1计算 ②换行也算一个输出字符,不要遗漏。

格式控制符 / 附加格式控制符 的位置

在 printf 函数中,对格式控制符和附加格式控制符的位置顺序有以下规定:%后依次为附加格式控制符和格式控制符。也就是说附加格式控制符在基本格式控制符之前。

如:

%hi:短整型十进制有符号整数

%lX:长整型十六进制无符号整数

......

还有一点需要注意的是,输出时如果输出的数据类型与格式控制符的类型不一致,则以格式控制符为准(相当于会做一个类似于强制类型转换的操作)。

其他需要注意的细节

当设置了输出宽度时,若数字为负数,则负号也占据一位。%g和%G都是选择小数和科学计数法中较短的一种情况输出,且只输出六位有效数字。若输出的是指数形式(科学计数法),%g输出小写e,而%G输出大写E。当数据有效位数超过精度时,超出部分用不可信的随机值补足位数。如果指定的总宽度小于有效位数的宽度,输出有效位数宽度(即有效位数全部输出不截断),超过部分用不可信的随机值补足。

以上就是C方式格式化输出的所有内容。后续会跟进一篇C语言格式化输入相关文章。

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