在竞赛中,使用 scanf
和 printf
往往十分方便。但是,如果在使用它们时,格式化字符串和参数类型不匹配,则会触发未定义行为,引起程序崩溃或输出错误结果。
这是大一新生经常写出来的东西:
int x;
scanf("%d", x);
vector<int> v = {1, 2, 3};
printf("%d\n", v.size());
printf("%d\n", 1ll * a * b % M);
打开 -Wformat=2
,或者至少 -Wformat=1
(被 -Wall
包含)。警告信息示例:
test.c:6:10: 警告:格式
%d
expects argument of typeint *
, but argument 2 has typeint
[-Wformat=]
按警告提示修复即可。
如果懒得处理这类问题,可以改用 cin
/cout
。在现代 Linux 系统上,如果使用了 ios::sync_with_stdio(false)
和 cin.tie(0)
,cin
/cout
甚至比 scanf
/printf
更快。