在竞赛中,使用 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: 警告:格式
%dexpects argument of typeint *, but argument 2 has typeint[-Wformat=]
按警告提示修复即可。
如果懒得处理这类问题,可以改用 cin/cout。在现代 Linux 系统上,如果使用了 ios::sync_with_stdio(false) 和 cin.tie(0),cin/cout 甚至比 scanf/printf 更快。