博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c语言标准库详解(二):stdio.h之格式化输出
阅读量:4170 次
发布时间:2019-05-26

本文共 2628 字,大约阅读时间需要 8 分钟。

c语言标准库详解(二):<stdio.h>之格式化输出

printf()函数

printf()函数提供格式化输出转换

fprintf()函数

int fprintf(FILE *stream,const char *format,...)

fprintf 函数按照 format 说明的格式对输出进行转换,并写到 stream 流中。返回值是实际写入的字符数。若出错则返回一个负值。

格式串

格式串由两种类型的对象组成:普通字符(将被复制到输出流中)与转换说明(分别决定下一后续参数的转换和打印) 。每个转换说明均以字符%开头,以转换字符结束。在%与转换字符之间可以依次包括下列内容:

  • 标志(可以以任意顺序出现),用于修改转换说明

- 指定被转换的参数在其字段内左对齐

+ 指定在输出的数前面加上正负号
空格 如果第一个字符不是正负号,则在其前面加上一个空格
0 对于数值转换,当输出长度小于字段宽度时,添加前导0进行填充
# 指定另一种输出形式。如果为 o 转换,则第一个数字为零;如果为 x 或 X 转换,则指定在输出的非 0 值前加 0x 或 0X;对于 e、E、f、g 或 G 转换,指定输出总包括一个小数点;对于 g 或 G 转换,指定输出值尾部无意义的 0 将被保留

  • 一个数值,用于指定最小字段宽度。转换后的参数输出宽度至少要达到这个数值。 如果参数的字符数小于此数值,则在参数宽边(如果要求左对齐的话则为右边)填 充一些字符。填充字符通常为空格,但是,如果设置了 0 填充标志,则填充字符为 0。
  • 点号,用于分隔字段宽度和精度。
  • 表示精度的数。对于字符串,它指定打印的字符的最大个数;对于 e、E 或 f 转换,它指定打印的小数点后的数字位数;对于 g 或 G 转换,它指定打印的有效数字位数;对于整型数,它指定打印的数字位数(必要时可加填充位 0 以达到要求的宽度)。
  • 长度修饰符 h、l 或 L。h 表示将相应的参数按 short 或 unsigned short 类型输出。l 表示将相应的参数按 long 或 unsigned long 类型输出;L 表示将相应的参数按 long double 类型输出。
    宽度和精度中的任何一个或两者都可以用*指定,这种情况下,该值将通过转换下一个参数计算得到(下一个参数必须为 int 类型)

转换字符及其意义

如果%后面的字符不是转换字符,则其行为没有定义。

转换字符 参数类型 转换结果
d,i int 有符号十进制表示
o unsigned int 无符号八进制表示
x,X unsigned int 无符号十六进制表示(没有前导0x或0X),如果是0x,则使用ABCDEF
u int 无符号十进制表示
c int 转换为unsigned char类型后变为一个字符
s char * 打印字符串中的字符,直到遇到’\0’或已经打印了由精度指定的字符数
f double 形式为[-]mmm.ddd的十进制表述,其中,d的数目由精度决定,默认为6。精度为0时不输出小数点
e,E double 形式为[-]m.dddddd e ±xx或[-]m.dddddd E ±xx。d的数目由精度决定,默认为6。精度为0时不输出小数点
g,G double 当指数小于4或大于等于精度时,采用%e或%E的格式,否则采用%f的格式。尾部的0和小数点不打印。
p void * 打印指针值(具体表示方式与实现有关)
n int * 到目前为止,此printf调用输出的字符的数目将被写入到相应参数中,不进行参数转换
% 不进行参数转换,打印一个符号%

格式化输出示例

#include 
#include
#include
int main(){
int printCount; int intAnimal = 114514; double animal = 114514.1919810; printf("Oct : %o\n",intAnimal); printf("Hex : %x\n",intAnimal); printf("HEX : %X\n",intAnimal); printf("The number of animal is %f.\n",animal); printf("This%n is a text\n",&printCount); printf("The output above contains %d chars.",printCount);}

输出:

Oct : 337522Hex : 1bf52HEX : 1BF52The number of animal is 114514.191981.ThisThe output above contains 0 chars.//这里看出,%n的语句有bug,不知道是不是windows的锅,还请看到的大佬指教。

printf()函数

int printf(const char *format,...)

printf(…)函数等价于fprintf(stdout,…)

sprintf()函数

int sprintf(char *s,const char *format,...)

sprintf() 函数与 printf() 函数基本相同,但其输出将被写入到字符串 s 中,并以’\0’ 结束。s 必须足够大,以足够容纳下输出结果。该函数返回实际输出的字符数,不包括’\0’。

其他函数

int vprintf(const char *format, va_list arg) int vfprintf(FILE *stream, const char *format, va_list arg) int vsprintf(char *s, const char *format, va_list arg)

vprintf、vfprintf、vsprintf 这 3 个函数分别与对应的 printf 函数等价,但它们用 arg 代替了可变参数表。arg 由宏 va_start 初始化,也可能由 va_arg 调用初始化。详细信息之后对<stdarg.h>头文件的讨论会涉及。

转载地址:http://edwai.baihongyu.com/

你可能感兴趣的文章
嵌入式100题(044):为什么客户端最后还要等待2MSL?
查看>>
嵌入式100题(045):为什么建立连接是三次握手,关闭连接确是四次挥手呢?...
查看>>
嵌入式100题(028):static的用法(定义和用途)
查看>>
嵌入式100题(027):char和int之间的转换
查看>>
嵌入式100题(029):const常量和#define的区别(编译阶段、安全性、内存占用等)...
查看>>
嵌入式100题(030):volatile作用和用法
查看>>
嵌入式100题(033):TCP、UDP的优缺点
查看>>
嵌入式100题(035):TCP为什么是可靠连接
查看>>
嵌入式100题(034):TCP UDP适用场景
查看>>
嵌入式100题(70):一个程序从开始运行到结束的完整过程(四个过程)
查看>>
嵌入式100题(71):什么是堆,栈,内存泄漏和内存溢出?
查看>>
嵌入式100题(73):死锁的原因、条件 创建一个死锁,以及如何预防
查看>>
嵌入式100题(60):系统调用的作用
查看>>
C语言基本概念归纳
查看>>
初识单片机
查看>>
在单片机上点亮LED
查看>>
初学定时器
查看>>
数码管
查看>>
单片机数码管消隐及中断
查看>>
C#串口调试助手代码
查看>>