2020-02-18 23:28:09 +08:00
# C 标准输入输出及格式化说明
## 格式化
2024-07-24 19:33:37 +08:00
```cpp
2020-05-07 13:18:26 +08:00
%[flags][width][.precision][length]specifier
2024-07-24 19:33:37 +08:00
```
2020-02-18 23:28:09 +08:00
即:
2024-07-24 19:33:37 +08:00
```cpp
2020-05-07 13:18:26 +08:00
%[标志][最小宽度][.精度][类型长度]说明符
2024-07-24 19:33:37 +08:00
```
2020-02-18 23:28:09 +08:00
2020-05-07 13:18:26 +08:00
### 标志 flags
2020-09-28 16:48:24 +08:00
| flags | Description |
2020-05-07 13:18:26 +08:00
|-------|--------------|
| - | 在给定的字段宽度内左对齐,右边填充空格(默认右对齐) |
| + | 强制在结果之前显示加号或减号(+ 或 -),即正数前面会显示 + 号(默认情况下,只有负数前面会显示一个 - 号) |
| 空格 | 输出值为正时加上空格,为负时加上负号 |
| # | specifier 是 o、x、X 时,增加前缀 0、0x、0X; specifier 是 e、E、f、g、G 时, 一定使用小数点; specifier 是 g、G 时,尾部的 0 保留 |
| 0 | 对于所有的数字格式,使用前导零填充字段宽度(如果出现了减号标志或者指定了精度,则忽略该标志) |
### 最小宽度 width
2020-09-28 16:48:24 +08:00
| width | Description |
|-------|-------------|
2020-05-07 13:18:26 +08:00
| 数字 | 字段宽度的最小值,如果输出的字段长度小于该数,结果会用前导空格填充;如果输出的字段长度大于该数,结果使用更宽的字段,不会截断输出 |
| * | 宽度在 format 字符串中规定位置未指定,使用星号标识附加参数,指示下一个参数是 width |
### 精度 precision
2020-09-28 16:48:24 +08:00
| precision | Description |
|-----------|-------------|
2020-05-07 13:18:26 +08:00
| .数字 | 对于整数说明符( d、i、o、u、x、X) : precision 指定了要打印的数字的最小位数。如果写入的值短于该数,结果会用前导零来填充。如果写入的值长于该数,结果不会被截断。精度为 0 意味着不写入任何字符;对于 e、E 和 f 说明符:要在小数点后输出的小数位数;对于 g 和 G 说明符:要输出的最大有效位数;对于 s 说明符:要输出的最大字符数。默认情况下,所有字符都会被输出,直到遇到末尾的空字符;对于 c 说明符:没有任何影响;当未指定任何精度时,默认为 1。如果指定时只使用点而不带有一个显式值, 则标识其后跟随一个 0。|
| .* | 精度在 format 字符串中规定位置未指定,使用点+星号标识附加参数,指示下一个参数是精度 |
### 类型长度 length
2020-02-18 23:28:09 +08:00
2020-09-28 16:48:24 +08:00
| length | Description |
|--------|-------------|
2020-05-07 13:18:26 +08:00
| h | 长度缩减一半,如 %hu 为 16 位无符号整数,%hhu 为 8 位无符号整数 |
| l | 长度增加一半,如 %ld 表示 long int, 而 %lld 表示 long long int |
### 说明符 specifier
2020-09-28 16:48:24 +08:00
| specifier | Description |
|-----------|-------------|
2020-05-07 13:18:26 +08:00
| d / i | 输出类型为有符号的十进制整数, i 是老式写法 |
| o | 输出类型为无符号八进制整数(没有前导 0) |
| u | 输出类型为无符号十进制整数 |
| x / X | 输出类型为无符号十六进制整数, x 对应的是 abcdef, X 对应的是 ABCDEF( 没有前导 0x 或者 0X) |
2024-07-24 19:33:37 +08:00
| f / lf | 输出类型为十进制表示的浮点数, 默认精度为6( lf 在 C99 开始加入标准,意思和 f 相同) |
2020-05-07 13:18:26 +08:00
| e / E | 输出类型为科学计数法表示的数,此处 "e" 的大小写代表在输出时用的 “e” 的大小写,默认浮点数精度为 6 |
| g | 根据数值不同自动选择 %f 或 %e, %e 格式在指数小于-4或指数大于等于精度时用使用 |
| G | 根据数值不同自动选择 %f 或 %E, %E 格式在指数小于-4或指数大于等于精度时用使用 |
| c | 输出类型为字符型。可以把输入的数字按照ASCII码相应转换为对应的字符 |
| s | 输出类型为字符串。输出字符串中的字符直至遇到字符串中的空字符(字符串以 '\0‘ 结尾,这个 '\0' 即空字符)或者已打印了由精度指定的字符数 |
2024-07-24 19:33:37 +08:00
| p | 以 16 进制形式输出指针 |
2020-05-07 13:18:26 +08:00
| % | 不进行转换,输出字符‘%’(百分号)本身 |
| n | 到此字符之前为止,一共输出的字符个数,不输出文本 |
### 转义序列
2020-09-28 16:48:24 +08:00
| 转义序列 | Description |
|---------|-------------|
2020-05-07 13:18:26 +08:00
| \' | 单引号 |
| \" | 双引号 |
| \? | 问号 |
| \\\\ | 反斜杠 |
| \a | 铃声(提醒) |
| \b | 退格 |
| \f | 换页 |
| \n | 换行 |
| \r | 回车 |
| \t | 水平制表符 |
| \v | 垂直制表符 |
2023-07-06 15:07:58 +08:00
## 示例
```cpp
int a=0x10A;
printf("%x.\n", a); // print 10a.
printf("%#x.\n", a); // print 0x10a.
printf("%X.\n", a); // print 10A
printf("%#X.\n", a); // print 0X10A
```