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

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

#include <stdio.h>
......

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

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

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

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

1 #include <stdio.h>
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)

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

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

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

  • 标志

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

 #include <stdio.h>

 int main()
{
printf("%20s\n", "hello world\n");
printf("%-20s\n", "hello world\n");
return ;
}

输出

        hello world

hello world

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

 #include <stdio.h>

 int main()
{
int i = printf("%20s\n", "hello world\n");
printf("%d\n", i);
printf("%+d\n", i);
printf("%+d\n", -i);
return ;
}

输出

        hello world

21
+21
-21

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

 #include <stdio.h>

 int main()
{
int i = printf("%20s\n", "hello world\n");
printf("%d\n", i);
printf("%+d\n", i);
printf("%+d\n", -i);
printf("%+ d\n", -i);
printf("% d\n", i);
return ;
}

输出

        hello world

21
+21
-21
-21
21

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

 #include <stdio.h>

 int main()
{
int i = printf("%20s\n", "hello world\n");
printf("%06d\n", i);
return ;
}

输出

        hello world

000021

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

 #include <stdio.h>

 int main()
{
int i = printf("你好!!!\n");
printf("%#o\n", i);
return ;
}

输出

你好!!!
010

共 8 个字节, 八进制是  010

 #include <stdio.h>

 int main()
{
int i = printf("!!!!!!你好!!!!!\n");
printf("%#x\n", i);
printf("%#X\n", i);
return ;
}

输出

!!!!!!你好!!!!!
0x10
0X10

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

  • 一个数值, 用于指定最小字段宽度
 #include <stdio.h>

 int main()
{
printf("%d\n", );
printf("%d\n", );
printf("%d\n", );
printf("%6d\n", );
printf("%6d\n", );
printf("%6d\n", );
return ;
}

输出

8
9
10
8
9
10

当然这里默认是右对齐的

  • 点号,用于分隔字段宽度和精度
  • 表示精度的数
 #include <stdio.h>
#define PI 3.1415926535897932384626433832795028841971693993751058209
int main()
{
printf("%30.20f\n", PI);
}

输出

        3.14159265358979310000

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

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

 #include <stdio.h>
#define PI 3.1415926535897932384626433832795028841971693993751058209
int main()
{
int a = , b = ;
printf("%*.*f\n", a, b, PI);
}

当然结果和上面一样

  • 长度修饰符 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调用输出的字符的数目将被写入到相应参数中, 不进行参数转换
% 不进行参数转换, 打印一个符号 %

格式化输出函数:printf 那些事 (C语言)的更多相关文章

  1. C语言printf()函数:格式化输出函数

    C语言printf()函数:格式化输出函数 头文件:#include <stdio.h> printf()函数是最常用的格式化输出函数,其原型为:     int printf( char ...

  2. c语言中格式化输出函数的研究

    <一>; 1.前言 在gcc编程中,我们比较经常用到的字符格式化输出函数是printf的,实际上gcc继承了c语言处理字符具有强大功能的风格,它提供了一系列的格式化输出函数,主要存在两个库 ...

  3. Shell 格式化输出printf、awk

    目录 Shell 文件的格式化与相关处理 printf.awk 格式化打印printf 案例.格式化输出文件内容 输出命令echo 案例 awk数据处理工具 语法格式 处理流程 AWK内置变量 条件 ...

  4. XLT格式化XML那点事(C#代码中的问题解决)(二)

    接上篇<XML通过XSL格式化的那点事(XML到自定义节点折叠显示)>,本文就如何将大的XLST分割成小文件和如何用C#将XML通过XSL生成HTML文件中的问题做下分析,避免有同样需求的 ...

  5. XML通过XSL格式化的那点事(XML到自定义节点折叠显示)

    引言 有时我们想看下系统生成的XML文件(如XML格式的Project文件),如果文件结构简单,我们浏览器看起来还比较方便,但是随着XML schema复杂后就变得让人头疼啦,单独写一个程序去做展现又 ...

  6. 7.20.01 java格式化输出 printf 例子

    java格式化输出 printf 例子 importjava.util.Date; publicclassPrintf { publicstaticvoidmain(String[] args) { ...

  7. Java面向对象 第2节 Scanner 类和格式化输出printf

    §Scanner 类 java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入. 1.创建 Scanner 对象的基本语法:Scanner s = ...

  8. 【转】java格式化输出 printf 例子

    [转]java格式化输出 printf 例子 转自http://www.cnblogs.com/TankMa/archive/2011/08/20/2146913.html#undefined imp ...

  9. shell编程系列15--文本处理三剑客之awk格式化输出printf

    shell编程系列15--文本处理三剑客之awk格式化输出printf printf的格式说明符 格式符 含义 %s 打印字符串 %d 打印十进制数 %f 打印一个浮点数 %x 打印十六进制数 %o ...

  10. 【JAVA】格式化打印printf的使用

    格式化打印printf的使用 import java.util.Date; /** * 使用printf输出 */ /**关键技术点 * 使用java.io.PrintStream的printf方法实 ...

随机推荐

  1. SQL Server 事务与隔离级别实例讲解

    上班途中,你在一处ATM机前停了下来.正当你在敲入密码的时候,你的一位家人也正在镇上的另一处TAM机上输入密码.你打算从某个还有500元余额的账户上转出400元,而你的家人想从同一账户取走300元.倘 ...

  2. tp3 链接生成二维码

    https://packagist.org/packages/endroid/qr-code

  3. linux查看硬盘详细信息

    最近公司新进了一批设备,为了弄清楚厂家有没有忽悠我们,分配给我一个任务 查看磁盘是不是二手的,window上有鲁大师啥的那么linux有什么软件吗? 答案是有的! 叫做smart 具体请查看: htt ...

  4. 错误 1 无法将文件“obj\Debug\XXX.exe”复制到“bin\Debug\XXX.exe”。文件“bin\Debug\XXX.exe”正由另一进程使用,因此该进程无法访问该文件

    在重新生成Windows服务的时候出现的这个问题,原因是因为你的Windows服务已经在运行了,你可以卸载掉这个服务,也可以在资源管理器里直接关闭.

  5. POJ - 3436 ACM Computer Factory(最大流)

    https://vjudge.net/problem/POJ-3436 题目描述:  正如你所知道的,ACM 竞赛中所有竞赛队伍使用的计算机必须是相同的,以保证参赛者在公平的环境下竞争.这就是所有这些 ...

  6. bzoj千题计划290:bzoj3143: [Hnoi2013]游走

    http://www.lydsy.com/JudgeOnline/problem.php?id=3143 计算每条边经过的概率e[] 然后经过概率多的分配的编号大,经过概率少的分配的编号小 如何计算边 ...

  7. CSS-3 Transition 的使用

    css的transition允许css的属性值在一定的时间区间内平滑地过渡.这种效果可以在鼠标单击.获得焦点.被点击或对元素任何改变中触发,并圆滑地以动画效果改变CSS的属性值." tran ...

  8. iOS 解决汉字联想输入,导致字数限制失效的问题

    字数限制的问题点在于汉语可以无限汉语联想词汇,导致字数限制对于汉字输入就失去的作用.我们的做法是监听键盘联想出来的汉子,将其统计: 1 在viewDidLoad里面监听文本变化的通知 - (void) ...

  9. supperset (python 2.7.12 + mysql)记录

    网上看到superset,比较感兴趣,虚机上搭一下,记录操作过程. 版本信息:CentOS 6.6 + python 2.7.12 + mysql 5.1.73 + setuptools 36.5.0 ...

  10. asp.net(c#)中相对路径(虚拟路径)和物理磁盘路径的转换

    物理路径:磁盘路径,也就是在磁盘上的位置. 虚拟路径:web页面上的路径,是相对于应用程序而言的. /// 将物理路径转换成相对路径           /// </summary>   ...