printf函数用法小记

By francis_hao    Aug 26,2017

C语言中printf函数是一个比较常用的函数,但是常用并不代表完全了解,本文翻译了printf的man手册,介绍了其全部功能(不包括man手册中不建议使用的)。

printf – 格式化输出转换

概述


#include <stdio.h>
int printf(const
char
*format,
...);

描述

printf()函数通过给定的format产生格式化的输出。

若函数执行成功,返回打印的字节数(不包括字符串结尾的null字节)。若出错,则返回一个负值。

format的格式

format是一个字符串,可以由普通字符和(或)一组转换说明组成。普通字符会直接被拷贝到输出流,不会做任何改变。而转换说明会把后面的参数取来按照自己的格式进行转换。每组转换说明由字符"%"引入,以一个转换说明符结束。在它们之间,可以(按此顺序)包含零个或多个标志,一个可选的最小字段宽度,一个可选的精度和一个可选的长度修饰符。

format后面的参数必须正确地对应相应的转换说明符。默认情况下,参数按给定的顺序使用,每个"*"和每个转换说明符需要吸取一个参数(参数不够会出错)。但是,用户也可以明确地指定需要哪个参数,在需要参数的位置用"%m$"代替"%",用"*m$"代替"*",m是一个十进制整数,用以指定需要的参数的位置,位置从1开始索引。所以

printf("%*d", width, num);

printf("%2$*1$d", width, num);

是等价的。这里"*"的用法需要注意,正如上面所讲,"*"也要吸取一个参数,因此

printf("%*d",
2,
5);

printf("%2d",
5);

是等价的

标志字符

字符"%"后面可以跟下面一个或多个标志


标志


说明


#


数值应转换成对应的形态,例如,"o"转换符会在数值的第一个字节添加0,"x"和"X"转换符会添加"0x"和"0X"。对于a,A,e,E,f,F,g和G转换符,输出的结果总包含一个小数点,即使其后没有小数位。对于其他转换符,结果是未定义的。


0


数值应由0填充,对于d,i,o,u,x,X,a,A,e,E,f,F,g和G转换符来说,转换结果从左侧填充0而不是默认的空格,如果0和-同时指定,0被忽略,如果指定了精度,d,i,o,u,x和X的0标志被忽略,其他转换符,结果是未定义的。


-


转换结果调整成左对齐,默认为右对齐。如果0和-同时指定,0被忽略


‘ ‘


一个空格,数值是一个有符号数的情况下,若是正数则空出一个空格。效果如下:



+


符号(+或-)总是出现在数值之前,默认正数是没有+号的。如果加号和上面的空格同时指定,空格被忽略。

字段长度

一个可选的十进制字串(第一个数字不为0)指定了一个字段的最小长度。如果要被转化的值的字符长度小于指定的长度,那么将会在左侧以空格填充(或者在右侧,如果指定了左对齐选项‘-‘)。除了十进制数字,也可以通过‘*‘或"*m$"来以其后的参数指定字段长度,此参数必须是int类型。

精度

可选的精度,形式是‘.‘后面跟着一个十进制数字串。除了十进制数字,也可以通过‘*‘或"*m$"来以其后的参数指定字段长度,此参数必须是int类型。如果只给出一个‘.‘或者精度是个负数,那么精度被设置为0。对于不同的转换符,精度有着不同的含义,分别如下:
1、对于d, i, o, u, x, 和 X转换符,精度指定了其最小数字长度(不足在前面补0)
2、对于a, A, e, E, f, 和 F转换符,精度指定了其小数位数(不足的在后面补0)
3、对于g和G转换符,精度指定了最大有效数字位数
4、对于s和S转换符,精度指定了要打印字符串的最大长度

长度修饰符

这里的整数转换符代表了d, i, o, u, x, 和X转换符。


hh


其后的整数转换符对应一个signed char或unsigned char参数

其后的n转换符对应一个指向signed char参数


h


其后的整数转换符对应一个short int或unsigned short int参数

其后的n转换符对应一个short int参数


l


其后的整数转换符对应一个long int或unsigned long int参数

其后的n转换符对应一个long int参数

其后的c转换符对应一个wint_t参数

其后的s转换符对应一个指向wchar_t类型指针的参数


ll


其后的整数转换符对应一个long long int 或 unsigned long long int参数

其后的n转换符对应一个long long int参数


L


其后的a, A, e, E, f, F, g和 G转换符对应一个long double参数


j


其后的整数转换符对应一个intmax_t或uintmax_t参数


z


其后的整数转换符对应一个size_t或ssize_t参数


t


其后的整数转换符对应一个ptrdiff_t参数

转换说明符


d, i


将int类型参数转换成有符号的十进制记法,如果指定精度,表示最少要出现的数字的长度,如果少于此长度,默认在左侧补0。默认的精度是1,如果打印0,而且指定精度为0,那将只会打印空字符。


o, u, x, X


将unsigned int类型参数转换成

o:无符号八进制记法

u:无符号十进制记法

x和X:无符号十六进制记法

如果指定精度,表示最少要出现的数字的长度,如果少于此长度,默认在左侧补0。默认的精度是1,如果打印0,而且指定精度为0,那将只会打印空字符。


e, E(大小写区分)


将double类型参数转换成形如[-]d.ddde±dd的风格。精度说明了小数点后的位数,默认为6


f, F


将double类型参数转换成形如[-]ddd.ddd的风格。精度说明了小数点后的位数,默认为6


g, G


将double类型参数转换成

g:f或e风格

G:F或E风格

精度指定了有效数字位数(比如1.23000的有效数字位数为3(1.23))。默认为6,如果精度指定为0,则认为是1。

e转换符风格在数值的指数小于-4或者大于等于精度值时才会用到,其他情况使用f风格。输出结果会移除小数点后无效的0。


a, A(大小写区分)


将double类型参数转换成十六进制记法,形如[-]0xh.hhhhp±。精度指定小数点后位数


c


如果没有指定l修饰符,则将int类似的参数转换成unsigned char并将对应的字符写入


s


如果没有指定l修饰符,则将const char *参数指向的字符串输出,直到遇到null字符。

但是,如果指定了精度,则只输出相应数量的字符。


p


将void *类型参数输出为十六进制(类似%#x or %#lx)


n


将此次调用已经写过的字符的数量存储在int *指定的参数中,此项不是转换操作,是唯一的结果参数。

例如printf("01234%n\n",&num);会将%n前面的字符数量5存储在num里。


m
(Glibc extension.)


打印strerror(errno),不需要参数


本文由 刘英皓 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,请注明出处:
转载自:http://www.cnblogs.com/yinghao1991/p/7434765.html

参考

【1】man 3 printf

【2】CSDN http://blog.csdn.net/xiaodao1986/article/details/8209567 printf中有趣的%n

时间: 2024-08-26 00:33:07

printf函数用法小记的相关文章

php中sprintf与printf函数用法区别

下面是一个示例:四舍五入保留小数点后两位 <?php $num1 = 21; echo sprintf("%0.2f",$num1)."<br />"; //输出 21.00 $num2 = 16.3287; echo sprintf("%0.2f",$num2)."<br />"; //输出 16.33 $num3 = 32.12329; echo sprintf("%0.2f&quo

scanf函数与printf函数用法

一开始学习就是用的cin.cout,所有习惯用这个,但是后来做题发现这样的输入方式有弊端,所以决定整理熟悉一下scanf函数与printf函数. 头文件 # include <stdio.h> scanf("输入控制符",输入参数) 在 scanf 的“输入参数”中,变量前面的取地址符&不要忘记. scanf 中双引号内,除了“输入控制符”外什么都不要写. “输出控制符”和“输出参数”无论在“顺序上”还是在“个数上”一定要一一对应. “输入控制符”的类型和变量所定义

scanf函数用法小记

By francis_hao    Aug 26,2017 scanf – 输入格式转换 概述 #include <stdio.h>int scanf(const char *format, ...); 描述 该函数通过format扫描标准输入stdin, format包含转换描述说明,如果需要转换,那么转换后的结果存储在format之后的指针参数中,每个指针参数类型必须要正确对应转换说明.如果format中转换说明符的个数,超过了后面的指针参数,那么结果将是未定义的.反过来,如果指针参数的数

PHP 字符串操作的 printf() 内置函数用法

php中指出打印输出的函数有很多 最常见的就是  echo  print()   printf()   spintf() 这几个了. echo 和 print() 功能相同,但是 print( )具有执行成功与否的返回值 (true 和 false). 使用函数 printf()  和 sprintf() 还可以实现一些更为复杂的格式化输出. 这两个的工作方式基本相同,只是printf() 函数是讲一个格式化的字符串输出到浏览器中,而 sprintf() 函数是返回一个格式化过的字符串. pri

C的第一课printf函数的基本用法

printf函数: printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息. printf()函数的调用格式为: printf("<格式化字符串>", <参量表>). #include <stdio.h> /* printf函数 printf("<格式化字符串>", <参量表>) */ int main() { int i=8,j=6; int *p=NULL; char *nam

print函数用法

stdio:包含标准输入输出的信息. printf这个函数的具体使用可以man一下得到 printf:formted output conversion 函数原型: note:这是一个不定参函数.  函数功能: stdin stdout stderr这在linux中是被作为三个文件使用的,系统启动完毕后会默认打开这三个文件.他们的文件描述符一次是0 1 2 本文中讲的printf属于第三章函数,它的实现其实是基于linux kernel中的printf函数来实现的,用户区加入了缓冲区,来增加效率

Linux下Kill函数用法

http://www.cnblogs.com/winnxm/archive/2010/01/22/1654502.html [ KILL ]功能描述: 用于向任何进程组或进程发送信号. 1 #include <sys/types.h> 2 3 #include <signal.h> 4 5 int kill(pid_t pid, int sig); 6 7 参数: pid:可能选择有以下四种 1. pid大于零时,pid是信号欲送往的进程的标识. 2. pid等于零时,信号将送往所

malloc函数用法

malloc函数用法 函数声明(函数原型): void *malloc(int size); 说明:malloc 向系统申请分配指定size个字节的内存空间.返回类型是 void* 类型.void* 表示未确定类型的指针.C,C++规定,void* 类型可以强制转换为任何其它类型的指针. 从函数声明上可以看出.malloc 和 new 至少有两个不同: new 返回指定类型的指针,并且可以自动计算所需要大小.比如: int *p; p = new int; //返回类型为int* 类型(整数型指

【C语言】浅谈可变参数与printf函数

一.何谓可变参数 int printf( const char* format, ...); 这是使用过C语言的人所再熟悉不过的printf函数原型,它的参数中就有固定参数format和可变参数(用"-"表示). 而我们又可以用各种方式来调用printf,如: printf( "%d ",value); printf( "%s ",str); printf( "the number is %d ,string is:%s ",