黑马程序员--C语言基础之--printf函数
------IOS培训期待与您交流! -------
上一篇介绍了C语言中scanf函数的用法,接下来让我们来进一步地认识了解一下printf函数。
一、printf函数的用法:
首先让我们来看一下其定义的格式:
int printf(const char *format,[argument])
(一)、一般格式
printf(格式控制,输出表列); 如:
printf("i=%d,ch=%c/n",i,ch);
说明:
(1)、“格式控制”是用双撇号括起来的字符串,也称“转换控制字符串”,它包括两种信息:
①格式说明:由“%”和格式字符组成,它的作用是将输出的数据转换为指定的格式输出
②普通字符,即需要原样输出的字符
(2)、“输出表列”是需要输出的一些数据,可以是表达式
(3)、printf函数的一般形式可以表示为:printf(参数1,参数2,……,参数n),其功能是将参数2~参数n按参数1给定的格式输出。
(二)、格式字符(9种)
(1)、d(或i)格式符。用来输出十进制整数,有以下几种用法:
①%d,按整型数据的实际长度输出
②%md,m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出
③%ld(%mld 也可),输出长整型数据
例如:
long a=123456; printf("%ld",a);
(2)、o格式符,以八进制数形式输出整数。格式:%o,%mo,%lo,%mlo都可
(3)、x(或X)格式符,以十六进制数形式输出整数。格式:%x,%mx,%lx,%mlx都可
(4)、u格式符,用来输出unsigned型数据,即无符号数,以十进制数形式输出。格式:%u,%mu,%lu都可
(5)、c格式符,用来输出一个字符。格式:%c,%mc都可
(6)、s格式符,用来输出一个字符串。格式:%s,%ms,%-ms,%m.ns,%-m.ns都可
(7)、f格式符,用来输出实数(包括单、双精度),以小数形式输出。格式:%f,%m.nf,%-m.nf都可(注意:单精度实数的有效位数一般为7位,双精度为16位)
(8)、e(或E)格式符,以指数形式输出实数。格式:%e,%m.ne,%-m.ne都可
(9)、g(或G)格式符,用来输出实数,它根据数值的大小,自动选f格式或e格式(选择输出时占宽度较小的一种)
(三)、说明
(1)、除了X、E、G(用大写字母表示)外,其他格式字符必须用小写字母
(2)、“格式控制”字符串内可以包含转义字符
(3)、如果想输出字符“%”,则应该在“格式控制”字符串中用连续两个%表示,如:
printf("%f%%",1.0/3);
(4)、printf函数常见格式字符表参见下表
printf函数常见格式字符表
格式字符 |
说 明 |
d,i |
以带符号的十进制形式输出整数(正数不输出符号) |
o |
以八进制无符号形式输出整数(不输出前导符0) |
x,X |
以十六进制无符号形式输出整数(不输出前导符0x) 用x则输出十六进制数的a~f时以小写形式输出,用X时,则以大写字母输出 |
u |
以无符号十进制形式输出整数 |
c |
以字符形式输出,只输出一个字符 |
s |
输出字符串 |
f |
以小数形式输出单、双精度数,隐含输出6位小数 |
e,E |
以指数形式输出实数 |
g,G |
选用%f或%e格式中输出宽度较短的一种格式,不输出无意义的0 |
二、程序例
/* 程序1 */ #include <stdio.h> int main(){ printf("Hello,world/n"); while(1); } /* 程序2 */ #include<stdio.h> int main(){ int i = 1, j =2; printf("%d %d/n",i,j); while(1); }
三、printf 命令
printf 命令转换、格式化并写 Argument 参数到标准输出。Argument 参数是由 Format 参数控制格式化的。格式化输出行不能超出 LINE_MAX 字节长度。
下列环境变量影响 printf 命令的执行:
(1)、LANG 在 LC_ALL 和相应的环境变量(以 LC_ 开头)没有指定语言环境时,确定语言环境编目使用的语言环境
(2)、LC_ALL 确定用于覆盖由 LANG 或其它任何 LC_ 环境变量设置的任何语言环境编目值的语言环境
(3)、LC_CTYPE 确定把文本字节数据顺序解释为字符的语言环境;例如,单一字节对应多字节字符的参数
(4)、LC_MESSAGES 确定写消息使用的语言
(5)、LC_NUMERIC 确定数字格式编排的语言环境,此环境变量影响使用 e、E、f、g 和 G 转换字符编写的数字的格式
Format 参数是包含三种对象类型的一个字符串:
* 无格式字符复制到输出流。
* 转换规范,每个规范导致在值参数列表中检索 0 个或更多个项。
* 以下转义序列。在复制到输出流时,这些序列导致它们的相关操作在有此功能的设备上显示:
// 反斜杠
/a 警告
/b 退格
/f 换页
/n 换行
/r 回车
/t 跳格
/v 垂直跳格
/ddd ddd 是 1、2 或 3 位八进制数字。这些转义序列作为由八进制数指定的具有数字值的字节显示。
Argument 参数是一个或多个字符串的列表,它在 Format 参数的控制下被写到标准输出。
Format 参数在必要的情况下会经常重新使用以满足 Argument 参数。将好像提供了空字符串 Argument 一样评估任何额外的 c 或者 s 转换规范;
其它额外转换规范将好像提供了 0 Argument 一样评估。此处 Format 参数不包含转换规范仅出现 Argument 参数,结果是不确定的。
每个 Format 参数中的转换规范都具有如下顺序的语法:
1. % (百分号)。
2. 零或更多的选项,修改转换规范的含义。选项字符和它们的含义是:
- 转换结果在字段中左对齐。
+ 符号转换结果常以符号(+ 或者 -)开始。
空格 如果符号转换的第一个字符不是符号,结果的前缀将是空格。如果空格和 + 选项字符都显示,则忽略空格选项字符。
# 此选项指定值转换到备用格式。对于 c、d、i, u 和 s 转换,选项没有作用。对于 o 转换,它增加精度来强制结果的第一数字是 a、0(零)。对于 x 和 X 转换,
非零结果分别具有 0x 或 0X 前缀。对于 e、E、 f、g 和 G 转换,结果通常包含基数字符,即使基数字符后没有数字。对于 g 和 G 转换,结尾零不象通常一样除去。
0 对于 d、i、o、 u、x、e、 E、f、g 和 G 转换,前导零(跟在符号或底数的后面)用于填充字段宽度,将不用空格填充。如果显示 0(零)和 -(减号)选项,
0(零)选项被忽略。对于 d、i、o、u、x 和 X 转换,如果指定精度,0(零)选项将被忽略。
注:
其它转换,没有定义其行为。
3. 可选 的指定最小值字段宽度的十进制数字字符串。如果转换值字符少于字段宽度,该字段将从左到右按指定的字段宽度填充。如果指定了左边调整选项,字段将在右边填充。
如果转换结果宽于字段宽度,将扩展该字段以包含转换后的结果。不会发生截断。然而,小的精度可能导致在右边发生截断。
4. 可选的精度。精度是一个 .(点)后跟十进制数字字符串。如果没有给出精度,按 0(零)对待。精度指定:
* d、o、i、 u、x 或 X 转换的最少数字显示位数。
* e 和 f 转换的基数字符后的最少数字显示位数。
* g 转换的最大有效数字位数。
* s 转换中字符串的最大打印字节数目。
5. 指示要应用的转换类型的一个字符,例如:
% 不进行转换。打印一个 %(百分号)。
d, i 接受整数值并将它转换为有符号的十进制符号表示法。精度指定显示的最小数字位数。如果值转换后可以用更少的位数来表示,将使用前导零扩展。缺省精度是 1。
精度为零的零值转换的结果是空字符串。用零作为前导字符来指定字段宽度,导致用前导零填充字段宽度值。
o 接受整数值并将它转换为有符号的八进制符号表示法。精度指定显示的最小数字位数。如果值转换后可以用更少的位数来表示,将使用前导零扩展。缺省精度是 1。
精度为零的零值转换的结果是空字符串。用零作为前导字符来指定字段宽度,导致用前导零填充字段宽度值。不用八进制值表示字段宽度。
u 接受整数值并将它转换为无符号的十进制符号表示法。精度指定显示的最小数字位数。如果值转换后可以用更少的位数来表示,将使用前导零扩展。缺省精度是 1。
精度为零的零值转换的结果是空字符串。用零作为前导字符来指定字段宽度,导致用前导零填充字段宽度值。
x, X 接受整数值并将它转换为十六进制符号表示法。字母 abcdef 用于 x 转换,字母 ABCDEF 用于 X 转换。精度指定显示的最小数字位数。如果值转换后可以用更少
的位数来表示,将使用前导零扩展。缺省精度是 1。精度为零的零值转换的结果是空字符串。用零作为前导字符来指定字段宽度,导致用前导零填充字段宽度值。
f 接受浮点或者双精度值并将它转换为十进制符号表示法,格式为 [-] ddd.ddd。基数字符(在这里显示为十进制点)后的数字位数等于规定的精度。
LC_NUMERIC 语言环境编目确定在这个格式中使用的基数字符。如果不指定精度,则输出六个数字。如果精度是 0(零),将不显示基数字符。
e, E 接受浮点或者双精度值并将它转换为指数表示的形式 [-] d.dde{+|-}dd。在基数字符前有一个数字(在这里显示为十进制点),基数字符后的数字位数等于规定的精度。
LC_NUMERIC 语言环境编目确定在这个格式中使用的基数字符。如果不指定精度,则输出六个数字。如果精度是 0(零),将不显示基数字符。
E转换字符在指数前生成带 E 而不是带 e 的数字。指数通常至少包含两个数字。然而,如果要打印的指数值大于两个数字,必要时需要打印附加指数数字。
g、G 接受浮点和双精度值并转换为 f 或 e 转换字符的样式(或在 G 转换的情况下是 E),用精度指定有效数字的个数。尾零将从结果中除去。
基数字符只有在其后是数字时显示。使用的样式取决于转换的值。样式 g 仅在转换的指数结果小于 -4,或大于或等于精度时使用。
c 接受值将其作为字符串并打印字符串中的第一个字符。
s 接受值将其作为字符串并打印字符串中的字符直到字符串结束或者达到精度指示的字符个数。如果没有指定精度,打印全部字符直到出现第一个空字符。
b 接受值将其作为字符串,可能包含反斜杠转义序列。打印来自转换字符串的字节直到字符串结束或者达到精度规范指示的字节数。
如果没有指定精度,打印全部字节直到出现第一个空字符。
支持下列反斜杠转义序列:
* 先前列出的反斜杠转义序列在 Format 参数描述下。这些转义序列将被转换到它们表示的单个字符。
* /c(反斜杠 c)序列,它不显示并使 printf 命令忽略 Format 参数中的字符串参数包含的剩余的所有字符串,所有剩余的字符串参数和所有附加字符。
退出状态
该命令返回以下出口值:
0 成功完成。
>0 发生错误。