Some Notes

Be HardWorking Every Day.

scanf 和 printf 的格式符

又是一个随记,方便自己的使用。C++ 中的 scanfprintf 其实有很多比 cin cout 好用的地方,放在这里。

scanf 的使用

读入的格式

就直接上表格吧,先把一些特定的读入格式符放在这儿:

格式符 用途
%d 读入 int 整型
%ld 读入 long 整型
%lld 读入 long long 整型
%hd 读入 short 整型
%u 读入 unsigned int 整型
%lu 读入 unsigned long 整型
%llu 读入 unsigned long long 整型
格式符 用途
%f 读入 float 类型
%lf 读入 double 类型
%Lf 读入 long double 类型
格式符 用途
%c 读入 char 类型
%s 读入字符串,也就是 char 数组
%o 读入八进制整型
%x 读入十六进制整型

以上其实都是一些读入的格式。还有一些能让读入的格式更加丰富的格式化。

限制位数

在以上的任何格式符的 % 后面加上数字 n,即读入的位数就是 n。例如:

int a, b;
scanf("%1d %1d", &a, &b);
printf("%d %d\n", a, b);

假设输入 10345 则会输出 1 0。

只读入,不赋值

在任何格式符的 % 后加上 *,就不会赋值给任何变量。例如:

int a;
long long b;
short c;
scanf("%d %*lld %lld %hd", &a, &b, &c);
printf("%d %lld %hd", a, b, c);

假设输入:

2147483647 4294967295 11415612712638 128

则输出:

2147483647 11415612712638 128

可见,scanf 忽略了第二个数字 4294967295。

printf 的使用

其实它和 scanf 差不多。但是有多了精度,对齐什么的。

标识和宽度

%[标识][宽度]

宽度其实和上面一样,只不过默认左对齐。标识就可以更改。

标识 作用
- 将宽度的数字右对齐
+ 正数显示正号
# %o 带有八进制前缀 0,和 %x 带有十六进制前缀 0x
0 将宽度的空格变成 0

例如:

int a, b, c, d, e, f;
scanf("%d %d %d %d %d %d", &a, &b, &c, &d, &e, &f);
printf("|%010d|%10d|%-10d|\n", a, b, c);  // |往左填零      |宽度为十            |靠左                 |
printf("|%+10d|%#10o|%#10x|\n", d, e, f); // |若正数显示正号|更改为八进制,有0前缀|更改为十六进制,有0x前缀|
// 宽度全部为十。

假设输入:

19283 1983 1283 12873 83287 7283

则会输出:

|0000019283|      1983|1283      |
|    +12873|   0242527|    0x1c73|

精度

用于小数,用 .n 标识保留 n 为小数。例如:

double p;
scanf("%lf", &p);
printf("%.3lf\n", p); // 保留三位小数

假设输入 114514.1919810 会输出 114514.192。