社区讨论

警示后人,如果你是 scanf 党人(OLE + RE 或者 全 TLE)

P2282[HNOI2003] 历史年份参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mi1vbp0r
此快照首次捕获于
2025/11/16 23:26
3 个月前
此快照最后确认于
2025/11/18 10:33
3 个月前
查看原帖
如果你是全 OLE 或者 OLE 9 个点 + RE 1 个点那么你可能使用了如下输入方式:
CPP
while (scanf("%s", S + 1) != EOF) {
  //...
}
如果你全部 TLE,那么你可能使用了如下输入方式:
CPP
while (scanf("%s", S + 1)) {
  //...
}
如果你想要取得 100pts.100pts. 的好成绩,你需要如下输入方式:
CPP
while (~scanf("%s", S + 1)) {
  //...
}
其中 ~scanf("%s", S + 1) 等价于 scanf("%s", S + 1) != -1
具体原因(可能):
  • 该题目中 scanf 读取失败返回值可能不是 EXACTLY EOF,于是挂了。
  • 理论上没任何返回值时 scanf 会是 0,本题应该有返回值,所以 while (scanf("%s", S + 1)) 死了。
本题读取失败没有返回 EOF,直接返回 -1 了(大概率是吧)。

回复

2 条回复,欢迎继续交流。

正在加载回复...