函数语法

stdio.h文件中的定义:

/* Write formatted output to stdout. */
int printf (const char *__restrict __format, ...)

作用:将格式化好的结果写到标准输出

有两个参数:

第一个参数为字符串类型的指针常量(只读变量),表示需要输出的格式。

第二个参数 "..." 表示被格式化的变量或常量,可为多个值中间用 "," 隔开,每个参数的值应当与前面格式化字符串中的占位符类型和位置一一对应。

返回值为 int 类型,表示输出的字节数

格式语法
%[flags][width][.precision][length]specifier
%[标志][宽度][.精度][长度]类型
flags
标志 含义
- 指定被转换的参数在其字段内左对齐(默认为右对齐)
+ 指定在输出的数前面加上正负号
空格 如果第一个字符不是正负号,则在其前面加上一个空格
0 对于数值转换,当输出长度小于字段宽度时,添加前导0进行填充
# 指定另一种输出形式:
1. 如果转换字符为 o,则第一个数字为 0
2. 如果转换字符为 x 或 X,则指定在输出的非 0 值前加 0x 或 0X
3. 对于转字符为 e, E, f, g, G 的情况,指定输出总是包含一个小数点,
另外对于转换字符为 g 或 G,还指定输出值尾部无意义的 0 将被保留

注意:flags可同时出现多个,并且没有顺序要求

下面通过示例说明

'-'

// - 指定被转换的参数在其字段内左对齐(默认为右对齐)
short a = 1;
// 将变量a按照10个字符的宽度输出, 默认为右对齐
// 右对齐
printf("%10d\n", a);
// 加上 "-" 后, 左对齐
printf("%-10d\n", a);

输出

         1
1

'+'

// + 指定在输出的数前面加上正负号
short b = 1;
printf("%d\n", b);
// b的值为1, 会将b的值前面隐藏的加号强制显示, 输出 +1
printf("%+d\n", b);
// -b的值为-1, 原样输出 -1
printf("%+d\n", -b);

输出

1
+1
-1

空格

// 空格 如果第一个字符不是正负号,则在其前面加上一个空格
short d = -1;
// d的第一个字符是负号, 原样输出-1
printf("% d\n", d);
// -d的值为1, 不带正负号, 输出 空格+1
printf("% d\n", -d);

输出

-1
1

0

// 0 对于数值转换,当输出长度小于字段宽度时,添加前导0进行填充
// 1. 数字
short e = 1;
// e的值为1, 要求按照宽度为5输出, 不足的部分宽度内左边补0
// 所以输出 "00001"
printf("%05d\n", e);
// 2. 字符
char f = 'a';
// 将字符型变量f按照宽度为5输出, 不足的部分宽度内左边
// 自动补空格, 所以输出 " a"
printf("%5c\n", f);
// 3. 字符串
char *str = "blank";
// str的值为字符串, 需要按照宽度为10输出
// 不足的部分宽度内左边自动补空格, 所以
// 输出 " blank"
// 注意: 字符串的结束字符 '\0' 不包含在内
printf("%10s\n", str);
// 4. 字符 '\0'
char blk = '\0';
// 打印字符 '\0', 按字符格式会输出 ''(空)
// 按整型格式会输出 "0"
printf("%c, %d\n", blk, blk);
char *blk2 = "hello\0";
// blk2的值包含字符 '\0', 以宽度为10输出
// 不足的部分宽度内自动补空格, 所以会输出
// " hello", 输出时 '\0' 没有被显示出来
printf("%10s\n", blk2);
// 包含两个 '\0', 输出结果跟上面一样
char *blk3 = "hello\0\0";
printf("%10s\n", blk3);

输出

00001
a
blank
, 0
hello
hello

'#'

// # 指定另一种输出形式(o, x或X, f, g或G, e或E)
int g = 1000;
// 依次按八进制, 十六进制格式输出
printf("%#od, %#xd, %#Xd\n", g, g, g);
// 将整数1e3, 1000按照科学计数法e, E整型格式输出
printf("%#ed, %#Ed, %#ed\n", 1e3, 1e3, 1000);
// 将浮点数1e-3, 0.001按照科学计数法e, E单精度类型格式输出
printf("%#ef, %#Ef, %#ef\n", 1e-3, 1e-3, 0.001);
// 将浮点数0.001按照单精度f单精度类型格式输出
printf("%#ff\n", 0.001);
// 将浮点数3.14按照双精度g或G双精度类型输出
printf("%#gg, %#GG\n", 3.14, 3.14);

输出

01750d, 0x3e8d, 0X3E8d
1.000000e+03d, 1.000000E+03d, 0.000000e+00d
1.000000e-03f, 1.000000E-03f, 1.000000e-03f
0.001000f
3.14000g, 3.14000G
width

宽度是一个数值,用于指定最小字段的宽度,转换后的参数输出宽度至少要达到这个数值,如果参数的字符数小于该数值,则在参数左边(如果flags设置为 "-",要求左对齐的话则在右边)填充一些字符,填充字符通常为空格,但是如果flags设置为 0,则填充字符为数字 0 。

/* 宽度(width)  */
char *ur = "human";
// 直接原样输出
printf("%s\n", ur);
// 以宽度为10输出, 同时宽度内右对齐, 左端补空格
printf("%10s\n", ur);
// 以宽度为10输出, 同时宽度内左对齐, 右段补空格
printf("%-10s\n", ur);
// 直接原样输出
printf("%d\n", 2);
// 以宽度为5输出, 同时宽度内右对齐, 左端补空格
printf("%5d\n", 2);
// 以宽度为5输出, 同时宽度内右对齐, 左端补0
printf("%05d\n", 2);
// 以宽度为5输出, 同时宽度内左对齐, 右端补空格
printf("%-5d\n", 2);
// 以宽度为5输出, 同时宽度内左对齐, 右端没有补0,
// 实际补的是空格, 最后输出 "2 "
printf("%-05d\n", 2);

输出

human
human
human
2
2
00002
2
2
.precision

格式为 "[.precision]" 或 "[.精度]",通过 "." 分隔字段的宽度和精度

说明:

  • 对于字符串,它指定打印的字符的最大个数
  • 对于整数,它指定打印的数字位数(必要时可加填充位 0 已达到宽度要求)
  • 对于转换字符为 e或E, f,它指定打印的小数点后的数字位数
  • 对于转换字符为 g或G,它指定打印的有效数字位数

下面通过示例说明

/* .精度(.precision) */
// 字符串
// 按最大3个字符输出, 超出的部分会被截断丢弃
printf("%.3s\n", "abcdefg");
// 按最大5个字符输出, 小于最大字符个数不会补
// 空格也不会默认右对齐, 会原样输出
printf("%.5s\n", "abc");
// 按最大5个字符输出, 小于最大字符个数不会补
// 空格也不会左对齐, 会原样输出
printf("%-.5s\n", "abc"); // 整数
// 按照整数3位输出, 实际值是5位
// 大于3位, 会原样输出, 不会被截取
printf("%.3d\n", 10000);
// 按照整数5位输出, 实际值是3位
// 不够的位数会从左端开始补0
printf("%.5d\n", 100); // e或E
// 取小数点之后3位, 多出的部分被截取丢弃, 同时会四舍五入
printf("%.3e, %.3E\n", 1.99991, 1.99991);
// 取小数点之后5位, 不够的部分用0填充
printf("%.5e, %.5E\n", -1.01, -1.01); // f
// 取小数点之后3位, 多出的部分被截取丢弃, 同时会四舍五入
printf("%.3f\n", 1.2689);
// 取小数点之后5位, 不够的部分用0填充
printf("%.5f\n", 1.26); // g或G
// 按照3位数字位数输出, 多出的部分被截取丢弃, 同时会四舍五入
// 3代表的是数字位数
printf("%.3g, %.3G\n", 2.888888, 2.888888);
// 按照5位数字位数输出, 不够的部分不会补空格和0
// 5代表的是数字位数
printf("%.5g, %.5G\n", 2.88, 2.88);

输出

abc
abc
abc
10000
00100
2.000e+00, 2.000E+00
-1.01000e+00, -1.01000E+00
1.269
1.26000
2.89, 2.89
2.88, 2.88
length

长度,可选的值为 h, hh, l, ll, L

  • hh 表示将相应的参数按 signed char 或 unsigned char 类型输出
  • h 表示将相应的参数按 short 或 unsigned short 类型输出
  • l 表示将相应的参数按 long 或 unsigned long 类型输出
  • ll 表示将相应的参数按 long long 或 unsigned long long 类型输出
  • L 表示将相应的参数按 long double 类型输出

下面通过示例说明

/* 长度 length */
// hh signed char, unsigned char
// 输出 ascii 65 对应的 A
printf("%hhc\n", '\x41');
printf("%hhc\n", -1); // h short, unsigned short
printf("%hd, %hd\n", 1, -1); // l long, unsigned long
printf("%ld, %ld\n", 1, -1); // ll long long, unsigned long long
printf("%lld, %lld\n", 1, -1); // L long double
printf("%Lg, %LG\n", 1, -1);

输出

A
ÿ
1, -1
1, 4294967295
1, 4294967295
-0, 5.12975E-4937
specifier
转换字符名 说明
c char 字符类型
d int 有符号十进制整数
i int 有符号十进制整数
e double 以指数形式输出单精度,双精度浮点数(小写 e)
E double 以指数形式输出单精度,双精度浮点数(大写 e)
f double 以小数形式输出单精度,双精度浮点数
g double 以 %f 或 %e 中较短的输出宽度输出单精度,双精度浮点数(指数显示小写e)
G double 以 %f 或 %e 中较短的输出宽度输出单精度,双精度浮点数(指数显示小写E)
o unsigned int 无符号八进制整数(无前导 0)
s char * 字符串
u unsigned int 无符号十进制整数
x unsigned int 无符号十六进制整数(无前导 0x)
X unsigned int 无符号十六进制整数(无前导 0X)
p void * 指针值
n int * 存放已写字符的个数
% 不进行参数转换,显示%自身
转义字符列表
转义字符 说明 ASCII (十进制)
\a 响铃(BEL) 7
\b 退格(BS),将当前位置移到前一列 8
\f 换页(FF),将当前位置移到下页开头 12
\n 换行(LF),将当前位置移到下一行开头 10
\r 回车(CR),将当前位置移到本行开头 13
\t 水平制表(HT),(跳到下一个TAB位置) 9
\v 垂直制表(VT) 11
\ 代表一个反斜杠字符 92
' 代表一个单引号字符 39
'' 代表一个双引号字符 34
? 代表一个问号 63
\0 空字符(NUL) 0
\ddd 1到3位八进制数所代表的任意字符 三位八进制
\xhh 十六进制所代表的任意字符 十六进制
标准ASCII表及其扩展表

C中printf函数的用法总结的更多相关文章

  1. matlab中patch函数的用法

    http://blog.sina.com.cn/s/blog_707b64550100z1nz.html matlab中patch函数的用法——emily (2011-11-18 17:20:33) ...

  2. mysql中INSTR函数的用法

    mysql中INSTR函数的用法 INSTR(字段名, 字符串) 这个函数返回字符串在某一个字段的内容中的位置, 没有找到字符串返回0,否则返回位置(从1开始) SELECT * FROM tblTo ...

  3. (转)解析PHP中ob_start()函数的用法

    本篇文章是对PHP中ob_start()函数的用法进行了详细的分析介绍,需要的朋友参考下     ob_start()函数用于打开缓冲区,比如header()函数之前如果就有输出,包括回车/空格/换行 ...

  4. Delphi中 StrToIntDef函数的用法

    Delphi中 StrToIntDef函数的用法:比如我要判断一个文本框里输入的字符串能不能转换为integer类型,如果能,则返回转换后的整型数据,如果不能,则返回整数0,那么我就可以用strtoi ...

  5. 单片机中printf函数的重映射

    单片机中printf函数的重映射 一.源自于:大侠有话说 1.如果你在学习单片机之前学过C语言,那么一定知道printf这个函数.它最最好用的功能 除了打印你想要的字符到屏幕上外,还能把数字进行格式化 ...

  6. Python中int()函数的用法浅析

      int()是Python的一个内部函数 Python系统帮助里面是这么说的 >>> help(int)  Help on class int in module __builti ...

  7. matlab中repmat函数的用法(堆叠矩阵)

    matlab中repmat函数的用法 B = repmat(A,m,n) B = repmat(A,[m n]) B = repmat(A,[m n p...]) 这是一个处理大矩阵且内容有重复时使用 ...

  8. Oracle 中 CONTAINS 函数的用法

    Oracle 中 CONTAINS 函数的用法 1. 查询住址在北京的学生 SELECT student_id,student_name FROM students WHERE CONTAINS( a ...

  9. Matlab中imfilter()函数的用法

    Matlab中imfilter()函数的用法 功能:对任意类型数组或多维图像进行滤波.用法:B = imfilter(A,H) B = imfilter(A,H,option1,option2,... ...

随机推荐

  1. CentOS7.6系统安装zabbix3.4.8客户端

    一.     准备安装包 将本地的zabbix-3.4.8软件包上传至服务器, 二.     安装依赖包 安装依赖包:yum install gcc* pcre* psmisc -y 三.     安 ...

  2. Sass函数:unit()函数

    unit() 函数主要是用来获取一个值所使用的单位,碰到复杂的计算时,其能根据运算得到一个“多单位组合”的值,不过只充许乘.除运算: >> unit(100) "" & ...

  3. KEGG注释

    在 KEGG 数据库中,把功能相似的蛋白质归为同一组,然后标上 KO 号.通过相似性比对,可以为未知功能的蛋白序列注释上 KO 号. 截止到 2015 年 6 月 12 日,KEGG 数据库中共收录了 ...

  4. postman自动化接口测试

    背景描述 有一个项目要使用postman进行接口测试,接口所需参数有: appid: 应用标识: sign:请求签名,需要使用HMACSHA1加密算法计算,签名串是:{appid}${url}${st ...

  5. 服务器构建CentOS+Jenkins+Git+Maven之爬坑

    ssh端口变更后,git如何访问远端中央代码库 参考来源: http://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin http://blog.csdn ...

  6. Delphi 窗体函数GetWindow

    Delphi 窗体函数GetWindowGetWindow是计算机的函数,该函数返回与指定窗口有特定关系(如Z序或所有者)的窗口句柄,函数原型是HWND GetWindow(HWND hWnd,UIN ...

  7. SQL注入的简单认识

    写在前面 MYSQL5.0之后的版本,默认在数据库中存放一个information_schema的数据库,其中应该记住里面的三个表SCHEMATA.TABLES.COLUMNS SCHEMATA表:存 ...

  8. LOJ 6433 「PKUSC2018」最大前缀和——状压DP

    题目:https://loj.ac/problem/6433 想到一个方案中没有被选的后缀满足 “该后缀的任一前缀和 <=0 ”. 于是令 dp[ S ] 表示选了点集 S ,满足任一前缀和 & ...

  9. LOJ 6436 「PKUSC2018」神仙的游戏——思路+卷积

    题目:https://loj.ac/problem/6436 看题解才会. 有长为 i 的 border ,就是有长为 n-i 的循环节. 考虑如果 x 位置上是 0 . y 位置上是 1 ,那么长度 ...

  10. 文字在线中间,CSS巧妙实现分隔线的几种方法

    单个标签实现分隔线: .demo_line_01{ padding: 0 20px 0; margin: 20px 0; line-height: 1px; border-left: 200px so ...