格式化I/O笔记

本文最后更新于 2025年6月30日

cstdio

使用头文件cstdio中的scanfprintf,定义如下。

1
2
3
4
5
6
7
8
9
10
int scanf(const char* format, ... );
int printf(const char* format, ... );
// 使用示例
int num;
float f;
char ch;
scanf("%d %f %c", &num, &f, &ch);
printf("你输入的整数是: %d\n", num);
printf("你输入的浮点数是: %.2f\n", f);
printf("你输入的字符是: %c\n", ch);

注意

  1. printf 不会自动换行,需要手动添加 \n
  2. scanf 在读取字符时会忽略空白字符,但 %c 除外。
  3. 使用 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/
作者
Mars
发布于
2025年4月30日
许可协议