printf函数用法小记
By francis_hao Aug 26,2017
C语言中printf函数是一个比较常用的函数,但是常用并不代表完全了解,本文翻译了printf的man手册,介绍了其全部功能(不包括man手册中不建议使用的)。
printf – 格式化输出转换
概述
|
#include <stdio.h> |
描述
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 |
打印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
printf函数用法小记的更多相关文章
- php中sprintf与printf函数用法区别
下面是一个示例:四舍五入保留小数点后两位 代码如下 复制代码 <?php$num1 = 21;echo sprintf("%0.2f",$num1)."<b ...
- ioctl函数用法小记
By francis_hao Aug 27,2017 UNPV1对ioctl有算是比较详细的介绍,但是,这些request和后面的数据类型是从哪里来的,以及参数具体该如何使用呢?本文尝试在不 ...
- scanf函数用法小记
By francis_hao Aug 26,2017 scanf – 输入格式转换 概述 #include <stdio.h>int scanf(const char *fo ...
- 几个常用I/O函数用法(printf,fprintf等)
一 格式化输出 1.printf 定义:int printf(const char *format,[argument]); 功能:产生格式化输出的函数(定义在 stdio.h 中) 参数说明:for ...
- 链式printf()函数的用法
printf()函数:十进制格式型输出函数. #include <stdio.h> int printf( const char *format, ... ); 1.首先printf的返回 ...
- memcpy函数用法
memcpy函数用法 .分类: VC++ VC++ mfc matlab 2011-12-01 19:17 14538人阅读 评论(0) 收藏 举报 null 原型:extern void *memc ...
- fprintf与fwrite函数用法与差异
在C语言中有两个常见的保存文件的函数:fprintf 与 fwrite.其主要用法与差异归纳如下: 一.fprintf函数. 1.以文本的形式保存文件.函数原型为 int fprintf(FILE* ...
- C语言中malloc()和calloc()c函数用法
C语言中malloc()和calloc()c函数用法 函数malloc()和calloc()都可以用来动态分配内存空间,但两者稍有区别. malloc()函数有一个参数,即要分配的内存空间的大小: ...
- sscanf和sprintf是scanf和printf家族用法 (转)
sscanf和sprintf是scanf和printf家族用法 sscanf和sprintf是scanf和printf家族的一对成员,用于处理和分析字符串非常强大得两个函数头文件 stdio.h原型i ...
随机推荐
- MySQL☞关联查询
关联查询:所需要的数据来源于多张表,通过表的连接查询(关联查询)来查询多张表中的数据 格式: select 别名1 . */列名 , 别名2 . */列名 from 表名1 别名1 , 表名2 别 ...
- git配置github链接
1.百度git官网-下载最新版git 2.一路默认下一步安装 3.打开 git bash here 命令行 4.注册github账号(用自己的邮箱就可以,不会英文可以用谷歌翻译)注册成功后建立项目 5 ...
- Linux命令应用大词典-第22章 GRUB
22.1 grub-md5-crypt:使用MD5格式加密口令 22.2 grub-install:在设备上安装GRUB 22.3 grub:进入GRUB命令shell 22.4 grub-crypt ...
- 【JSON类】使用说明
理解键名路径 键名路径(keyPath)用于定位json的键,比如:{book: {title:”中国人”} },键名路径 book.title 表定位到book下的title键. 对于值是数组类型的 ...
- 【wx:for】小程序列表渲染的使用说明
wx:for 控制属性绑定一个数组,即可使用数组中各项的数据重复渲染该组件. 默认数组的当前项的下标变量名默认为 index,数组当前项的变量名默认为 item,即: {{index}} . {{it ...
- Java 集合学习--HashMap
一.HashMap 定义 HashMap 是一个基于散列表(哈希表)实现的键值对集合,每个元素都是key-value对,jdk1.8后,底层数据结构涉及到了数组.链表以及红黑树.目的进一步的优化Has ...
- DNA序列 (DNA Consensus String,ACM/ICPC Seoul 2006,UVa1368
题目描述:算法竞赛入门经典习题3-7 题目思路:每列出现最多的距离即最短 #include <stdio.h> #include <string.h> int main(int ...
- 网页性能管理详解:浅谈chrome-Timeline及window.requestAnimationFrame()方法
你遇到过性能很差的网页吗? 这种网页响应非常缓慢,占用大量的CPU和内存,浏览起来常常有卡顿,页面的动画效果也不流畅. 你会有什么反应?我猜想,大多数用户会关闭这个页面,改为访问其他网站.作为一个开发 ...
- 统计学习三:1.k近邻法
全文引用自<统计学习方法>(李航) K近邻算法(k-nearest neighbor, KNN) 是一种非常简单直观的基本分类和回归方法,于1968年由Cover和Hart提出.在本文中, ...
- geth账户密码
xiaocong geth账户密码 123 {d6abe909013d8da914ae2a08c9b58e7b76601b39} 账户密码 123456 0x4A7F15104F54dB3214D2F ...

