老师未批改
3. printf 详解笔记.
函数原型
int printf( const char *format, ... );
int printf( const char *restrict format, ... );参数介绍
我们先来学习下我们的printf函数:
翻译的不好请见谅!
您也可以看 下面从网站上引用的原信息.
stream - 输出流, 比如是文件(FILE), 标准输出流(stdout), 字符串缓冲区(buffer)
buffer - 指向要写入的一个字符串缓冲区的指针.
bufsz - 指定要写入的长度, 会写入 bufsz - 1 个字符, 然后附加一个'\0'到.
format - 指向一个包含结束符('\0')的规定如何解释数据(格式化)的多字节的特殊字符串的指针.
格式化字符串包含普通的多字节字符, 格式化格式字符(不包括%), 和转义字符. 在输出到输出流时, 普通字符被复制, 不会改变, 转义字符会被转义, 格式化格式字符(转换规范)将会被格式化.
format这个参数的格式基本上可以表示为: %[flags][width][.prec][F|N|h|l]type
具体解释如下:
· 以 % 为开始字符.
· 标志(flags) - (可选的) 一个或多个可以修改(控制)转换行为的标识字符.
· -: 将转换结果在字段内变为左对齐.(默认是右对齐的)
· +: 将有符号的转换结果加上符号, 默认的没有正数符号.
· 空格: 如果结果是一个有符号的转换结果, 但是并没有符号字符(+, -), 则空格将会补齐它. 在存在"+"标志的时候, 空格标志不生效.
· #: 在执行的时候进行替换. 具体请参照下边的表格详细说明.
· 0: 对整数和浮点数转换来说, 使用0来代替使用空格补全指定的长度.
对整数来说, 如果显示指定了精度, 该标志将会被忽略.
如果其他的转换使用了这个标志, 结果将是未定义的行为, 即可能会出错, 不能预知正确的结果.
如果有标志"-", 则忽略该标志.
· 位数(width) - (可选的) 用一个整数, 或者"*"来指定字段的最小长度. 默认的它会使用空格进行补齐.
如果规定了该参数, 那么如果是左对齐就在右侧补齐, 如果是右对齐就在左侧补齐.
如果使用了"*", 必须传递一个int类型的参数. 如果给定的是一个负数, 那么与指定标识"-"结果类似, 使用该结果的默认长短.
(注意: 这里是规定的最小长度, 如果超出了这个长度, 结果不会被截断.)
· 精度(.prec) - (可选的) 在字符"."后紧跟一个整数或一个"*"字符, 或者不指定转换的精度.
如果使用了"*", 必须传递一个int类型的参数. 如果给定的是一个负数, 那么该参数将被忽略.
如果既没有数字也没有"*"被指定, 那么精度为0.
· (可指定的) 指定的参数大小的长度修饰符
· 转换格式说明符具体转换说明符表:
|
转换 说明符 |
解释 | 参数类型 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 长度修饰符 |
hh
|
h
|
(none) |
l
|
ll
|
j
|
z
|
t
|
L
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
%
|
输出字符 %. 完整的转换描述符的写法应该是
%%.
|
<td class="table-na" style="background: #ececec; color: grey; vertical-align: middle;
text-align: center;">
N/A
<td class="table-na" style="background: #ececec; color: grey; vertical-align: middle;
text-align: center;">
N/A
<td class="table-na" style="background: #ececec; color: grey; vertical-align: middle;
text-align: center;">
N/A
<td class="table-na" style="background: #ececec; color: grey; vertical-align: middle;
text-align: center;">
N/A
<td class="table-na" style="background: #ececec; color: grey; vertical-align: middle;
text-align: center;">
N/A
<td class="table-na" style="background: #ececec; color: grey; vertical-align: middle;
text-align: center;">
N/A
<td class="table-na" style="background: #ececec; color: grey; vertical-align: middle;
text-align: center;">
N/A
<td class="table-na" style="background: #ececec; color: grey; vertical-align: middle;
text-align: center;">
N/A
<td class="table-na" style="background: #ececec; color: grey; vertical-align: middle;
text-align: center;">
N/A
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
c
|
<dl> <dd> 输出单个字符. </dd> </dl> <p> 参数会被转换为 <span class="t-c"><span class="mw-geshi c source-c"> <span class="kw4">unsigned</span> <span class="kw4">char</span></span></span>. 如果使用了 l 修饰符, 即使用 %lc , 参数会被转换为一个字符串, 就像<span class="t-c"><span class="mw-geshi c source-c"> <span class="kw4">wchar_t</span><span class="br0">[</span><span class="nu0">2</span><span class="br0">]</span></span></span>类型的参数使用 %ls 修饰符一样. </p> | <td class="table-na" style="background: #ececec; color: grey; vertical-align: middle; text-align: center;"> N/A <td class="table-na" style="background: #ececec; color: grey; vertical-align: middle; text-align: center;"> N/A<div class="t-vertical"> <div> <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">int</span></span></span></div> </div> | <div class="t-vertical"> <div> <span class="t-c"><span class="mw-geshi c source-c">wint_t</span></span></div> </div> | <td class="table-na" style="background: #ececec; color: grey; vertical-align: middle; text-align: center;"> N/A <td class="table-na" style="background: #ececec; color: grey; vertical-align: middle; text-align: center;"> N/A <td class="table-na" style="background: #ececec; color: grey; vertical-align: middle; text-align: center;"> N/A <td class="table-na" style="background: #ececec; color: grey; vertical-align: middle; text-align: center;"> N/A <td class="table-na" style="background: #ececec; color: grey; vertical-align: middle; text-align: center;"> N/A|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
s
|
<dl> <dd> 输出 字符串 </dd> </dl> <p> 参数必须是一个指向字符数组首元素的指针. 精度 指定要写入的字节的最大数目。如果 精度 没有指定, 将写入每个字节,直到遇到第一个终止符('0')。 如果指定了 l 修饰符, 即(%ls) , 则参数必须是一个指向 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">wchar_t</span></span></span>类型的数组首元素的指针, 其中, 如果调用 <span class="t-lc"> wcrtomb</span> 进行初始化, 参数将会被转换为char型的数组. <span style="color:red">(最后一句英文比较蹩脚, 不知翻译的对不对)</span> </p> | <td class="table-na" style="background: #ececec; color: grey; vertical-align: middle; text-align: center;"> N/A <td class="table-na" style="background: #ececec; color: grey; vertical-align: middle; text-align: center;"> N/A<div class="t-vertical"> <div> <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">char</span><span class="sy2">*</span></span></span></div> </div> | <div class="t-vertical"> <div> <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">wchar_t</span><span class="sy2">*</span></span></span></div> </div> | <td class="table-na" style="background: #ececec; color: grey; vertical-align: middle; text-align: center;"> N/A <td class="table-na" style="background: #ececec; color: grey; vertical-align: middle; text-align: center;"> N/A <td class="table-na" style="background: #ececec; color: grey; vertical-align: middle; text-align: center;"> N/A <td class="table-na" style="background: #ececec; color: grey; vertical-align: middle; text-align: center;"> N/A <td class="table-na" style="background: #ececec; color: grey; vertical-align: middle; text-align: center;"> N/A|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
di
|
<dl>
<dd>
将一个有符号整数转换成十进制表示形式 [-]dddd.
</dd>
</dl>
<p>
精度 指定了要显示的数字的最小数目。默认精度是
<span class="t-c"><span class="mw-geshi c source-c"><span class="nu0">1</span></span></span>。 如果精度和被转换的参数都为 <span class="t-c"><span class="mw-geshi c source-c"> <span class="nu0">0</span></span></span>, 那么转换结果将为空. </p> |
<div class="t-vertical"> <div> <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">signed</span> <span class="kw4">char</span></span></span></div> </div> | <div class="t-vertical"> <div> <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">short</span></span></span></div> </div> | <div class="t-vertical"> <div> <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">int</span></span></span></div> </div> | <div class="t-vertical"> <div> <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">long</span></span></span></div> </div> | <div class="t-vertical"> <div> <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">long</span> <span class="kw4">long</span></span></span></div> </div> | <div class="t-vertical"> <div> <span class="t-c"><span class="mw-geshi c source-c"> <span class="kw118">intmax_t</span></span></span></div> </div> | <div class="t-vertical"> <div> signed <span class="t-c"><span class="mw-geshi c source-c"> <span class="kw100">size_t</span></span></span></div> </div> | <div class="t-vertical"> <div> <span class="t-c"><span class="mw-geshi c source-c"> <span class="kw101">ptrdiff_t</span></span></span></div> </div> | <td class="table-na" style="background: #ececec; color: grey; vertical-align: middle; text-align: center;"> N/A|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
o
|
<dl> <dd> 将一个无符号整数转换成八进制表示形式 oooo. </dd> </dl> <p> 精度 指定了要显示的数字的最小数目。默认精度是 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu0">1</span></span></span>. 如果精度和被转换的参数都为 <span class="t-c"><span class="mw-geshi c source-c"> <span class="nu0">0</span></span></span>, 那么转换结果将为空. 如果有必要提高精度, 有一种 代替的实现方法, 就是写一个前导0(%0o). 在这个方案中, 如果被转换参数和精度都是 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu0">0</span></span></span>, 转换结果将会出现一个 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu0">0</span></span></span>. </p> | <div class="t-vertical"> <div> <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">unsigned</span> <span class="kw4">char</span></span></span></div> </div> | <div class="t-vertical"> <div> <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">unsigned</span> <span class="kw4">short</span></span></span></div> </div> | <div class="t-vertical"> <div> <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">unsigned</span> <span class="kw4">int</span></span></span></div> </div> | <div class="t-vertical"> <div> <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">unsigned</span> <span class="kw4">long</span></span></span></div> </div> | <div class="t-vertical"> <div> <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span></span></span></div> </div> | <div class="t-vertical"> <div> <span class="t-c"><span class="mw-geshi c source-c"> <span class="kw132">uintmax_t</span></span></span></div> </div> | <div class="t-vertical"> <div> <span class="t-c"><span class="mw-geshi c source-c"> <span class="kw100">size_t</span></span></span></div> </div> | <div class="t-vertical"> <div> unsigned version of <span class="t-c"><span class="mw-geshi c source-c"> <span class="kw101">ptrdiff_t</span></span></span></div> </div> | <td class="table-na" style="background: #ececec; color: grey; vertical-align: middle; text-align: center;"> N/A|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
xX
|
<dl>
<dd>
将一个无符号整数转换成十六进制表示形式 hhhh.
</dd>
</dl>
<p>
当修饰符是小写 x 的时候, 转换结果将使用小写字母 abcdef.当修饰符是大写 X 的时候, 转换结果将使用大写字母 ABCDEF.精度 指定了要显示的数字的最小数目。默认精度是 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu0">1</span></span></span>. 如果被转换的参数和精度都是 <span class="t-c"><span class="mw-geshi c source-c"> <span class="nu0">0</span></span></span> , 那么转换结果将为空. 如果想要转换结果为非0, 可以使用这种 代替的实现方法 , 就是在转换修饰符前加 0x 或者 0X (%0x 或者 %0X).
</p>
|
<td class="table-na" style="background: #ececec; color: grey; vertical-align: middle;
text-align: center;">
N/A
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
u
|
<dl> <dd> 将一个无符号整数 转换成十进制表示形式 dddd. </dd> </dl> <p> 精度 指定了要显示的数字的最小数目。默认精度是 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu0">1</span></span></span>. 如果被转换的参数和精度都是 <span class="t-c"><span class="mw-geshi c source-c"> <span class="nu0">0</span></span></span> ,那么转换结果将为空. </p> | <td class="table-na" style="background: #ececec; color: grey; vertical-align: middle; text-align: center;"> N/A|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fF
|
<dl> <dd> 将一个 浮点数 转换为十进制形式 [-]ddd.ddd. </dd> </dl> <p> 精度 指定了小数点之后出现的数字的最小数目。默认精度是 <span class="t-c"><span class="mw-geshi c source-c"> <span class="nu0">6</span></span></span>. 如果想要实现不是浮点数也要显示小数点, 可以使用这种代替的解决方法 . 对于无限小数和非数字的转换风格, 请看说明. <span style="color:red">(最后一句英文比较绕口, 不知翻译的对不对)</span> </p> | <td class="table-na" style="background: #ececec; color: grey; vertical-align: middle; text-align: center;"> N/A <td class="table-na" style="background: #ececec; color: grey; vertical-align: middle; text-align: center;"> N/A<div class="t-vertical"> <div> <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">double</span></span></span></div> </div> | <div class="t-vertical"> <div> <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">double</span></span></span> <span class="t-mark-rev t-since-c99">(since C99)</span></div> </div> | <td class="table-na" style="background: #ececec; color: grey; vertical-align: middle; text-align: center;"> N/A <td class="table-na" style="background: #ececec; color: grey; vertical-align: middle; text-align: center;"> N/A <td class="table-na" style="background: #ececec; color: grey; vertical-align: middle; text-align: center;"> N/A <td class="table-na" style="background: #ececec; color: grey; vertical-align: middle; text-align: center;"> N/A<div class="t-vertical"> <div> <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">long</span> <span class="kw4">double</span></span></span></div> </div> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e
E
|
<dl>
<dd>
将一个 浮点数 转换为十进制的指数表示法(科学计数法)。
</dd>
</dl>
<p>
如果转换修饰符是小写 e , 那么转换风格是 [-]d.ddde±dd
如果转换修饰符是大写 E , 那么转换风格是 [-]d.dddE±dd
指数包含至少两个数字,只有在必要时才会使用更多的位数。如果值为 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu0">0</span></span></span> ,指数也是 <span class="t-c"><span class="mw-geshi c source-c"> <span class="nu0">0</span></span></span>. 精度 指定了小数点之后出现的数字的最小数目。默认精度是 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu0">6</span></span></span>. 如果想要实现不是浮点数也要显示小数点, 可以使用这种代替的解决方法 . 对于无限小数和非数字的转换风格, 请看说明. <span style="color:red">(最后一句英文比较绕口, 不知翻译的对不对)</span> </p> |
<td class="table-na" style="background: #ececec; color: grey; vertical-align: middle;
text-align: center;">
N/A
<td class="table-na" style="background: #ececec; color: grey; vertical-align: middle;
text-align: center;">
N/A
<td class="table-na" style="background: #ececec; color: grey; vertical-align: middle;
text-align: center;">
N/A
<td class="table-na" style="background: #ececec; color: grey; vertical-align: middle;
text-align: center;">
N/A
<td class="table-na" style="background: #ececec; color: grey; vertical-align: middle;
text-align: center;">
N/A
<td class="table-na" style="background: #ececec; color: grey; vertical-align: middle;
text-align: center;">
N/A
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
a
A
|
<dl>
<dd>
将一个浮点数转换为十六进制的指数记数法(科学计数法)。
</dd>
</dl>
<p>
如果转换修饰符是小写 a , 那么转换风格为 [-]0xh.hhhp±d
如果转换修饰符是大写 A , 那么转换风格为 [-]0Xh.hhhP±d
如果参数不是一个正常的浮点数, 那么第一个十六进制的数字是 0
如果值为 <span class="t-c"><span class="mw-geshi c source-c">
<span class="nu0">0</span></span></span>, 那么指数也是 <span class="t-c"><span
class="mw-geshi c source-c"><span class="nu0">0</span></span></span>.
精度 指定了小数点之后出现的数字的最小数目。默认精度是
足够精确的值表示.
如果想要实现不是浮点数也要显示小数点, 可以使用这种代替的解决方法 .
对于无限小数和非数字的转换风格, 请看说明.
<span style="color:red">(最后一句英文比较绕口, 不知翻译的对不对)</span>
</p>
|
<td class="table-na" style="background: #ececec; color: grey; vertical-align: middle;
text-align: center;">
N/A
<td class="table-na" style="background: #ececec; color: grey; vertical-align: middle;
text-align: center;">
N/A
<td class="table-na" style="background: #ececec; color: grey; vertical-align: middle;
text-align: center;">
N/A
<td class="table-na" style="background: #ececec; color: grey; vertical-align: middle;
text-align: center;">
N/A
<td class="table-na" style="background: #ececec; color: grey; vertical-align: middle;
text-align: center;">
N/A
<td class="table-na" style="background: #ececec; color: grey; vertical-align: middle;
text-align: center;">
N/A
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
g
G
|
<dl>
<dd>
根据一个 浮点数 的值和精度将其转换为十进制或者十进制指数表示法(科学计数法).
</dd>
</dl>
<p>
如果转换修饰符是小写 g 那么转换风格同使用转换修饰符 e
或者 f.如果转换修饰符是大写 G 那么转换风格同使用转换修饰符 E
或者 F.假设 P 代表非零精度, 如果未指定精度, 那么精度默认为<span class="t-c"><span class="mw-geshi c source-c">
<span class="nu0">6</span></span></span>,
如果精度为 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu0">0</span></span></span>
那么指定精度为 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu0">
1</span></span></span>.
然后, 对于指数型转换风格 E 将会有指数 X:
</p>
小练习
网站引用原文<style type="text/css"> </style>
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
