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

格式化输出用于将传入的参数列表转换为 format 中对应的格式代码并将内容格式化输出到标准输出设备上。

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

格式化输出函数

库函数中提供了 printffprintf以及 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 intunsigned short int,如 %hu
  • hh 表示 signed charunsigned char,如 %hhu
  • l 表示 long intunsigned long int,如 %ld
  • ll 表示 long long intunsigned long long int,如 %llu
  • L 表示 long double,如 %Ld
  • t 表示 ptrdiff_tptrdiff_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前缀,%X0X 前缀。

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语言格式化输出


原文始发于微信公众号(海人为记):一文讲解C语言格式化输出

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/27446.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!