格式化输出用于将传入的参数列表转换为 format
中对应的格式代码并将内容格式化输出到标准输出设备上。
格式化输出函数
库函数中提供了 printf
、fprintf
以及 sprintf
几种函数用于实现格式化输出。
printf
C 语言中,提供了 printf
函数用于格式化输出,其原型如下所示。
int printf(char const *format, ...);
-
format
:格式化字符串,其中包含格式代码。
printf
函数在输出格式 format
的控制下,将参数转换为 format
中对应的格式代码,并将格式化后的内容输出到标准输出设备上,其返回值为打印的字符数。
int a = 5, b = 10;
int sum = a + b;
printf("The result is %dn", sum);
如上所示,printf
函数在格式化输出时,将 %d
格式代码转换为 sum
的值。
fprintf
库函数中提供的 fprintf
函数,也是用于格式化输出,函数原型如下所示。
int fprintf(FILE *stream, char const *format, ...);
-
stream
:指向FILE
对象的指针。 -
format
:格式化字符串,其中包含格式代码。
fprintf
函数会将格式化后的内容输出到 stream
指定的文件中,其返回值为实际输出的字符数。
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *fp;
char words[] = "Hello, World!";
fp = fopen("fprintf.txt", "w");
if (fp == NULL) {
perror("fopen");
exit(EXIT_FAILURE);
}
fprintf(fp, "%s", words);
if (fclose(fp) != 0) {
perror("fclose");
exit(EXIT_FAILURE);
}
return 0;
}
如上面代码所示,打开 fprintf.txt
文件,会看到 Hello, World!
已经写到文件中。
sprintf
库函数提供的 sprintf
的原型如下所示。
int sprintf(char *dest, char const *format, ...);
-
dest
:指向字符数组的指针。 -
format
:格式化字符串,其中包含格式代码。
sprintf
函数会将格式化后的内容输出到 dest
指定的字符数组中,其返回值为实际输出的字符数。
int v = 5;
char dest[20];
sprintf(dest, "The result is %dn", 5);
printf("%sn", dest); // The result is 5
在使用 sprintf
函数时,如果输出结果溢出缓冲目标 dest
,可能改写 dest
后面内存位置中的数据。因此,写入时可以声明巨大缓冲区或者分析转换后需要的缓冲大小。
格式代码
格式代码是由百分号 %
加上标志字符,如下所示。
%[flags][width][.precision][length] type
-
flags
:零个或多个可选的标志,用于规定输出样式。 -
width
:可选的最小宽度,用于控制输出内容的宽度,如%10d
。 -
.precision
:可选的精度,用于控制输出的精度,如%.10d
。 -
length
:可选的长度,用于控制数值长度,如%llu
。 -
type
:转换类型。如%d
中的d
,将值转换为整型格式化输出。
可选的长度length
支持不同的类型,如
-
h
表示short int
或unsigned short int
,如%hu
。 -
hh
表示signed char
或unsigned char
,如%hhu
。 -
l
表示long int
或unsigned long int
,如%ld
。 -
ll
表示long long int
或unsigned long long int
,如%llu
。 -
L
表示long double
,如%Ld
。 -
t
表示ptrdiff_t
,ptrdiff_t
是两个指针差值的类型,如%td
。 -
z
表示size_t
,如%zd
。
%c
参数是 int
类型,打印一个字符。
char c = 'X';
printf("The result is %cn", c); // The result is X
%i、%d
参数是 int
类型,打印一个十进制整数。
int v = -5;
printf("The result is %in", v); // The result is -5
%u
参数是 unsigned int
类型,打印一个无符号的十进制值。
int v = 12999;
printf("The result is %un", v); // The result is 12999
%o
参数是 unsigned int
类型,打印一个无符号的八进制值。
unsigned int v = 12999;
printf("The result is %on", v); // The result is 31307
%x 或 %X
参数是 unsigned int
类型,打印一个无符号的十六进制值。%x
约定小写字母,%X
约定大写字母。
unsigned int v = 12999;
printf("The result is %xn", v); // The result is 32c7
%e 或 %E
参数是 double
类型,根据指数形式打印。如 %e
会打印 6.023e32
,%E
会打印 6.023E32
。
double v = 12999.31;
printf("The result is %en", v); // The result is 1.299931e+004
%f
参数是 double
类型,打印浮点数,精度决定小数点后面位数。
float f = 3.1415926;
printf("The result is %fn", f); // The result is 3.141593
缺省值是 6
,如果都打印出来,就需要设置精度,如 %.10f
。
%g 或 %G
参数是 double
类型,%g
是以 %f
格式或 %e
格式打印,%G
是以 %f
格式或 %E
格式打印。打印结果取决于它的值,如果指数大于等于 -4
但小于精度字段就使用 %f
格式,否则使用指数格式。
double v = 12999.31
printf("The result is %gn", v); // The result is 12999.3
%s
参数是 char *
类型,打印一个字符串。
char *v = "Hello, World";
printf("The result is %sn", v); // The result is Hello, World
%p
参数是 void *
类型,指针值被转换为因编译器而异的可打印字符。
int a = 12;
int *p = &a;
printf("The result is %pn", p); // The result is 000000000061FDFC
打印的是以十六进制形式表示的指针指向的地址。
格式标记
printf
函数中可以用 +
、-
、0
、#
以及空格五种标记,如下所示。
标记+
+
用于表示符号位,当值非负时,格式化输出的值会加上 +
;当值为负时,会在值上加上 -
。缺省情况下不会显式符号。
int v1 = 5;
printf("The result is %dn", v1); // The result is 5
printf("The result is %+dn", v1); // The result is +5
int v2 = -5;
printf("The result is %+dn", v2); // The result is -5
标记-
-
用于将打印的值左对齐,缺省情况下为右对齐。
int v = 5;
printf("The result is %10dn", v); // The result is 5
printf("The result is %-10dn", v); // The result is 5
如上所示,%10d
输出 v
的值,因数字不够,会用空格填充,将真正的值 5
放在了最右边;而使用 %-10d
就会将 5
放在左边。
标记0
使用 0
标记时,会将数值右对齐,而使左边出现的空格用 0
来填充,可用于表示数值的格式代码,当给出精度和符号 -
,零标志会被忽略。
int v = 5;
printf("The result is %10dn", v); // The result is 5
printf("The result is %010dn", v); // The result is 0000000005
标记#
使用 #
时,会将某些格式代码转换为另一种形式,如下所示。
如果是 %o
,会将输出的值的开头加一个零。
unsigned int v = 12999;
printf("The result is %on", v); // The result is 31307
printf("The result is %#on", v); // The result is 031307
如果是 %x
或 %X
,会在非零值前面加 0x
前缀,%X
是 0X
前缀。
unsigned int v = 12999;
printf("The result is %xn", v); // The result is 32c7
printf("The result is %#xn", v); // The result is 0x32C7
%e
、%E
以及 %f
在加上标记 #
后,会在结果中始终包含一个小数点,即使它后面没有数字。
float f = 3.1415926;
printf("The result is %.0fn", f); // The result is 3
printf("The result is %#.0fn", f); // The result is 3.
%g
和 %G
与上面的情况相同。另外,缀尾的 0
并不从小数中去除。
标记空格
只用于转换有符号值的代码。当值非负时,这个标志把一个空格添加到它的开始位置。
int v = 5;
printf("The result is %dn", v); // The result is 5
printf("token The result is % dn", v); // The result is 5
空格和
-
是相互排斥的,如果两个同时给出,空格标志会被忽略
原文始发于微信公众号(海人为记):一文讲解C语言格式化输出
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/27446.html