格式化I/O笔记
本文最后更新于 2025年6月30日
cstdio
使用头文件cstdio
中的scanf
和printf
,定义如下。
1 |
|
注意:
printf
不会自动换行,需要手动添加\n
。scanf
在读取字符时会忽略空白字符,但%c
除外。- 使用
scanf
时要确保输入的数据类型与占位符匹配,否则可能导致错误。
format格式说明
%[flags][width][.precision][length]specifier
格式字符specifier
指明数据输出的类型与形式。
specifier | 输出形式 | 示例 |
---|---|---|
d / i | 有符号十进制整数 | 392 |
u | 无符号十进制整数 | 7235 |
o | 无符号八进制数 | 610 |
x | 无符号十六进制整数 | 7fa |
X | 无符号十六进制整数(大写) | 7FA |
f | 十进制浮点数(小写) | 392.65 |
F | 十进制浮点数(大写) | 392.65 |
e | 科学计数法(尾数+指数的形式),小写 | 3.9265e+2 |
E | 科学计数法(尾数+指数的形式),大写 | 3.9265E+2 |
g | 使用 %e 和 %f 中的较短形式输出 | 392.65 |
G | 使用 %E 和 %F 中的较短形式输出 | 392.65 |
a | 十六进制浮点数(小写) | -0xc.90fep-2 |
A | 十六进制浮点数(大写) | -0XC.90FEP-2 |
c | 字符 | a |
s | 字符串 | sample |
p | 指针地址 | b8000000 |
n | 对应的参数为一个指向 int 类型变量的指针。%n 不输出任何内容,而是用于将已经输出的字符个数(不包括 %n 对应的输出)存储到指针所指向的变量中。 printf() 的返回值也表示输出的字符个数,一般情况下两者是相等的。 |
|
% | % 后面再跟一个 %,会输出一个 %,可以看做 % 的转义形式 | % |
对齐方式flags
flags | 说明 |
---|---|
- | 在给定的输出宽度内左对齐。如果不指明,默认为右对齐。 |
+ | 用于整数或小数,输出时强制加上正负号,即使对于正数也是如此。如果不指明,默认只有负数才加- 符号。 |
空格 | 用于整数或者小数,输出值为正时冠以空格,为负时冠以负号。 |
# | 对于八进制(%o)和十六进制(%x / %X)整数,# 表示在输出时添加前缀;八进制的前缀是 0,十六进制的前缀是 0x / 0X。 对于小数(%a / %A、%e / %E、%f / %F、%g / %G),# 表示强迫输出小数点。如果没有小数部分,默认是不输出小数点的,加上 # 以后,即使没有小数部分也会带上小数点。 |
0 | 当输出宽度不足时,在数字左侧填充 0,而不是空格。 |
输出宽度width
width | 说明 |
---|---|
数字 | width 为一个整数时,表示最小的输出宽度。如果实际输出宽度不足 width,则以 flags 指定的方式来填充;如果 flags 没有指定,则以空格来填充。 当输出结果的宽度超过 width 时,width 不再起作用,按照实际宽度来输出。 |
* | 宽度不在格式字符串 format 中指定,而是在对应的参数(输出数据)前面再增加一个额外的参数,专门用来指定输出宽度。 |
输出精度.precision
.precision | 说明 |
---|---|
.数字 (整数) |
1. 对于 %d、%i、%o、%u、%x、%X 说明符(整数),precision 表示最小输出宽度;实际宽度不足时用 0 填充,实际宽度超过 precision 时不起作用,以实际宽度输出。和 width 不同的是,输出宽度不足时 precision 会在左边补 0,而不是空格。 precision 为 0 是一个特殊情况,如果对应的参数(输出数据)是 0,则不输出任何字符,如果对应的参数不为 0,则按实际值输出。 2. 对于 %a、%A、%e、%E、%f、%F 说明符(浮点数),precision 表示小数的位数,也就是小数点后面的数字个数(默认情况下为 6): a. 当小数部分的位数大于 precision 时,会按照四舍五入的原则丢掉多余的数字; b. 当小数部分的位数小于 precision 时,会在后面补 0。 3. 对于 %g 和 %G 说明符,precision 表示要输出的最大有效数字的个数。 4. 对于 %s,precision 表示要打印的最大字符个数,超出 precision 部分会被截断。默认情况下,将打印所有字符,直到遇到结束标志 \0 。如果只有. 没有precision,那么假定 precision 为 0,也就是不输出任何字符。 |
.* | 精度不在格式字符串 format 中指定,而是在对应的参数(输出数据)前面再增加一个额外的参数,专门用来指定精度。 |
length
length 是 specifier 的子说明符,用来改变数据类型的长度。这意味着,对应的参数在适当的情况下可以进行类型转换,或者类型提升。
length | %d %i | %u %o %x %X | %f %F %e %E %g %G %a %A |
%c | %s | %p | %n |
---|---|---|---|---|---|---|---|
默认(不指明 length) | int |
unsigned int |
double |
int |
char* |
void* |
int* |
hh |
signed char |
unsigned char |
signed char* |
||||
h |
short int |
unsigned short int |
short int* |
||||
l |
long int |
unsigned long int |
wint_t |
wchar_t* |
long int* |
||
ll |
long long int |
unsigned long long int |
long long int* |
||||
j |
intmax_t |
uintmax_t |
intmax_t* |
||||
z |
size_t |
size_t |
size_t* |
||||
t |
ptrdiff_t |
ptrdiff_t |
ptrdiff_t* |
||||
L |
long double |
格式化I/O笔记
https://keqing10.github.io/2025/04/30/CPP/CPP-format-io/