博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
格式化输出函数:printf 那些事 (C语言)
阅读量:7065 次
发布时间:2019-06-28

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


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

函数包含在头文件  <stdio.h>  中

#include 
......

 函数的原型在头文件的声明为

_CRTIMP __cdecl __MINGW_NOTHROW  int printf (const char *, ...);

第一个参数  const char * 来指明输出的格式 , 按照格式对输出进行转换, 并写到标准输出流中(stdin),后面的三个点  . . . 表示此处的参数是可变参数,这样可以满足不同的输出需求

 如果打印输出成功函数返回打印的字节数(函数返回值为  int  类型), 如果出错则返回一个负值

1 #include 
2 3 int main()4 {5 int i = printf("你好\n");6 printf("%d\n", i);7 return 0;8 }

 输出

你好5

 成功输出   你好  并且返回打印的字符个数  5  (一个汉字的编码占2个字节 * 2 + '\n'一个字节  = 5)

格式串由两种类型对象组成:

----- 普通字符(将被复制到输出流中)

----- 转换说明(分别决定下一个后续参数的转换和打印), 每个转换说明均以 % 开头, 以转换字符结束, 在%与转换字符之间可以一次包括下列内容

  • 标志

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

1 #include 
2 3 int main()4 {5 printf("%20s\n", "hello world\n");6 printf("%-20s\n", "hello world\n");7 return 0;8 }

              输出

hello worldhello world

            +  只定在输出的数前面加上正负号

1 #include 
2 3 int main() 4 { 5 int i = printf("%20s\n", "hello world\n"); 6 printf("%d\n", i); 7 printf("%+d\n", i); 8 printf("%+d\n", -i); 9 return 0;10 }

            输出

hello world21+21-21

            空格  如果第一个字符不是正负号, 则在它的前面加上空格

1 #include 
2 3 int main() 4 { 5 int i = printf("%20s\n", "hello world\n"); 6 printf("%d\n", i); 7 printf("%+d\n", i); 8 printf("%+d\n", -i); 9 printf("%+ d\n", -i);10 printf("% d\n", i);11 return 0;12 }

             输出

hello world21+21-21-21 21

              0  对于数制转换, 当输出长度小于字段宽度时, 在前面添加 0 作为填充

1 #include 
2 3 int main()4 {5 int i = printf("%20s\n", "hello world\n");6 printf("%06d\n", i);7 return 0;8 }

            输出

hello world000021

            #  指定另一种输出格式。 如果为 o 则第一个数字为0(表示八进制), 如果为 x 或 X , 则指定在输出的非0值前加 0x 或 0X (表示十六进制)

1 #include 
2 3 int main()4 {5 int i = printf("你好!!!\n");6 printf("%#o\n", i);7 return 0;8 }

           输出

你好!!!010

           共 8 个字节, 八进制是  010

1 #include 
2 3 int main()4 {5 int i = printf("!!!!!!你好!!!!!\n");6 printf("%#x\n", i);7 printf("%#X\n", i);8 return 0;9 }

           输出

!!!!!!你好!!!!!0x100X10

            共 16 个字节, 十六进制是  0x10

  • 一个数值, 用于指定最小字段宽度
1 #include 
2 3 int main() 4 { 5 printf("%d\n", 8); 6 printf("%d\n", 9); 7 printf("%d\n", 10); 8 printf("%6d\n", 8); 9 printf("%6d\n", 9);10 printf("%6d\n", 10);11 return 0;12 }

           输出

8910     8     9    10

 当然这里默认是右对齐的

  • 点号,用于分隔字段宽度和精度
  • 表示精度的数
1 #include 
2 #define PI 3.14159265358979323846264338327950288419716939937510582093 int main()4 {5 printf("%30.20f\n", PI);6 }

 输出

3.14159265358979310000

可以看出双精度浮点型可以精确到小数点后 16 位左右

         -------------------  宽度和精度中任何一个或者两个都可以用 * 代替, 通过转换下一个参数计算得到(下一个参数必须为 int 类型

1 #include 
2 #define PI 3.14159265358979323846264338327950288419716939937510582093 int main()4 {5 int a = 30, b = 20;6 printf("%*.*f\n", a, b, PI);7 }

当然结果和上面一样

  • 长度修饰符 h , l 或 L 。

          h:将相应的参数按照 short 或 unsigned short 类型输出

          l:将相应的参数按照 long 或 unsigned long 类型输出

          L:将相应的参数按照 long double 类型输出


 printf 函数的转换字符(以 % 开头, 如果 % 后面的字符不是转换字符, 则它行为没有定义)

转换字符 参数类型, 转换结果
d, i int, 有符号十进制表示
o unsigned int, 无符号八进制表示(无前导0)
x, X unsigned int, 无符号十六进制表示(无前导0x和0X)。如果是0x, 则使用abcdef, 如果是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调用输出的字符的数目将被写入到相应参数中, 不进行参数转换
% 不进行参数转换, 打印一个符号 %

转载于:https://www.cnblogs.com/xinglichao/p/9182128.html

你可能感兴趣的文章
一步步教你用 CSS 为 SVG 添加过滤器
查看>>
TeeChart Pro VCL/FMX教程(一):入门——构建图表
查看>>
微服务架构 SpringCloud(二)Eureka(服务注册和服务发现基础篇)
查看>>
oracle RAC的客户端HA配置
查看>>
VsCode编辑器
查看>>
spring cloud开发、部署注意事项
查看>>
又一款基于BCH开发出来的社交软件BlockPress
查看>>
ttlsa教程系列之mongodb——(五)mongodb架构-复制原理&复制集
查看>>
虚拟主机通过修改.htaccess将入口重定向到public文件夹
查看>>
nginx快速安装
查看>>
Kinect for windows的脸部识别
查看>>
MySQL 运维笔记(一)—— 终止高负载SQL
查看>>
Carrie Higbie:数据中心的绿色布线之道
查看>>
ECS之初体验
查看>>
我的友情链接
查看>>
【风云原创】Flash技术将被Html5枪毙,Silverlight将何去何从?
查看>>
power shell测试wmi
查看>>
话里话外:成功CEO的用人之道——按需激励
查看>>
openwrt无线连接互联网的实现原理【1】
查看>>
WPS for Linux(ubuntu)字体配置(字体缺失解决办法)
查看>>