警示后人(C语言全WA的原因)

P5730 【深基5.例10】显示屏

milk2715093695 @ 2023-11-21 10:43:39

为什么你的代码明明本地测试能通过但是全部WA?

如果你遇到了这个问题,那么你大概率是使用了 scanf("%c", &a); 进行读入。

事实上,这道题的数据每行末尾不只有 '\n' ,还有一个 '\r' 。(寄了无数次试出来的血的教训)

拿第一组数据为例,你看到的是

6
114514

你以为的输入:6\n114514,其实真正输进去的是6\r\n114514(没想到吧)。

所以很多c语言的代码直接用%c读入就错了。

下面提供几个可以参考的思路

  1. 方案一:先用 scanf("%d\n", &n); 读入位数,此时 '\r' 和 '\n' 都已经被处理掉了;接下来就可以正常使用 scanf("%c", &a); ( a 是 char 类型的)读入了。

  2. 方案二:读入位数部分正常使用 scanf("%d", &n); ,读入每一位的部分使用 scanf("%1d", &a); ( a 是 int 类型的)。

  3. 方案三:读入位数部分仍然正常使用 scanf("%d", &n); ,读入每一位的部分使用 scanf("%s", str); ( str 是字符数组),然后再对 str 的每一位分别处理。

  4. 方案四:读入位数部分仍然正常使用 scanf("%d", &n); ,在读入每一位数字前先 getchar(); 两次,分别处理掉 '\r' 和 '\n' ,随后正常使用 scanf("%c", &a); ( a 是 char 类型的)。

  5. 方案五:读入位数部分仍然正常使用 scanf("%d", &n); ,在读入每一位数字前先用 scanf("\n"); 把 '\n' 处理掉,同时 '\r' 被跳过。

(不过不知道为什么 scanf("\n"); 能过,但是 scanf("%*[\n]") 过不了,有人帮忙解释一下吗?)

  1. 方案六:读入位数部分仍然正常使用 scanf("%d", &n); ,读入每一位数字时使用 scanf("%1s", str) 以达成每次处理一位的效果。

by xiao__xiu @ 2023-11-21 10:48:04

太太太太太太太太太感谢了!


by 20230332fuben @ 2023-11-30 22:58:21

@milk2715093695 感谢感谢感谢,这题这输入真让人抓马


by 2911841277wxh @ 2023-12-14 19:35:34

谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢你!在我的vscode里我只用了一次getchar()就恢复正常了,看来可能是标准啥的不太一样吧,要不是看到了你我还要寻思不知道多久


by milk2715093695 @ 2023-12-25 22:30:56

顺便一提,字符串的题单基本上都会有这种情况,所以这个题单得尽量避免用 scanf("%c")


by zfydoomfist @ 2024-01-19 03:58:31

感谢楼主


by yunyi1129 @ 2024-01-20 17:02:31

@milk2715093695 太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太 感谢你了;


by m_iGameState @ 2024-02-14 12:31:27

太感谢了,孩子都快崩溃了


by woshipjj @ 2024-02-21 16:43:24

@milk2715093695 谢谢


by AN34543 @ 2024-03-26 18:26:59

@milk2715093695 万分感谢,少一个getchar纠结半天了


by UmiAdventure @ 2024-04-24 13:53:14

我靠!谢谢谢谢谢谢你!


| 下一页