暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

一文讲解C语言格式化输出

海人为记 2021-11-30
1380

格式化输出用于将传入的参数列表转换为 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 %d\n", 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 %d\n"5);
printf("%s\n", 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 %c\n", c);    // The result is X

%i、%d

参数是 int
类型,打印一个十进制整数。

int v = -5;
printf("The result is %i\n", v);    // The result is -5

%u

参数是 unsigned int
类型,打印一个无符号的十进制值。

int v = 12999;
printf("The result is %u\n", v);    // The result is 12999

%o

参数是 unsigned int
类型,打印一个无符号的八进制值。

unsigned int v = 12999;
printf("The result is %o\n", v);    // The result is 31307

%x 或 %X

参数是 unsigned int
类型,打印一个无符号的十六进制值。%x
约定小写字母,%X
约定大写字母。

unsigned int v = 12999;
printf("The result is %x\n", v);    // The result is 32c7

%e 或 %E

参数是 double
类型,根据指数形式打印。如 %e
会打印 6.023e32
%E
会打印 6.023E32

double v = 12999.31;
printf("The result is %e\n", v);    // The result is 1.299931e+004

%f

参数是 double
类型,打印浮点数,精度决定小数点后面位数。

float f = 3.1415926;
printf("The result is %f\n", 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 %g\n", v);    // The result is 12999.3

%s

参数是 char *
类型,打印一个字符串。

char *v = "Hello, World";
printf("The result is %s\n", v);    // The result is Hello, World

%p

参数是 void *
类型,指针值被转换为因编译器而异的可打印字符。

int a = 12;
int *p = &a;
printf("The result is %p\n", p);    // The result is 000000000061FDFC

打印的是以十六进制形式表示的指针指向的地址。

格式标记

printf
函数中可以用 +
-
0
#
以及空格五种标记,如下所示。

标记+

+
用于表示符号位,当值非负时,格式化输出的值会加上 +
;当值为负时,会在值上加上 -
。缺省情况下不会显式符号。

int v1 = 5;
printf("The result is %d\n", v1);    // The result is 5
printf("The result is %+d\n", v1);    // The result is +5
int v2 = -5;
printf("The result is %+d\n", v2);    // The result is -5

标记-

-
用于将打印的值左对齐,缺省情况下为右对齐。

int v = 5;
printf("The result is %10d\n", v);    // The result is          5
printf("The result is %-10d\n", v);    // The result is 5

如上所示,%10d
输出 v
的值,因数字不够,会用空格填充,将真正的值 5
放在了最右边;而使用 %-10d
就会将 5
放在左边。

标记0

使用 0
标记时,会将数值右对齐,而使左边出现的空格用 0
来填充,可用于表示数值的格式代码,当给出精度和符号 -
,零标志会被忽略。

int v = 5;
printf("The result is %10d\n", v);    // The result is          5
printf("The result is %010d\n", v);    // The result is 0000000005

标记#

使用 #
时,会将某些格式代码转换为另一种形式,如下所示。

如果是 %o
,会将输出的值的开头加一个零。

unsigned int v = 12999;
printf("The result is %o\n", v);    // The result is 31307
printf("The result is %#o\n", v);    // The result is 031307

如果是 %x
%X
,会在非零值前面加 0x
前缀,%X
0X
前缀。

unsigned int v = 12999;
printf("The result is %x\n", v);    // The result is 32c7
printf("The result is %#x\n", v);    // The result is 0x32C7

%e
%E
以及 %f
在加上标记 #
后,会在结果中始终包含一个小数点,即使它后面没有数字。

float f = 3.1415926;
printf("The result is %.0f\n", f);    // The result is 3
printf("The result is %#.0f\n", f);    // The result is 3.

%g
%G
与上面的情况相同。另外,缀尾的 0
并不从小数中去除。

标记空格

只用于转换有符号值的代码。当值非负时,这个标志把一个空格添加到它的开始位置。

int v = 5;
printf("The result is %d\n", v);    // The result is 5
printf("token The result is % d\n", v);    // The result is  5

空格和 -
是相互排斥的,如果两个同时给出,空格标志会被忽略




文章转载自海人为记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论