时间:2021-11-11 10:26:27 | 栏目:C代码 | 点击:次
在牛客做了很多坑爹的题,明明代码没问题但是就退无法AC,看了很多题解之后,发现是scanf读取缓存区,在输入输出时出现了问题 于是写个博客总结一下
首先我们要了解什么是 scanf 函数
根据 cplusplus.com的解释
scanf()函数是通用 终端格式化输入 函数,它从标准输入设备(键盘)
读取输入的信息。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。 其调用格式为:
scanf("<格式化字符串>",<地址表>);
并且注意:scanf()函数返回成功赋值的数据项数,出错时则返回EOF。
当进一步深挖之后(暂时不需要知道原理,只需要知道结果即可),
可以得到这样一个认识:
键盘输入的东西并没有直接给scanf读取 而是在缓冲区进行暂时存放
比如这样一段代码:
#include <stdio.h> int main() { int a, b, c, d, e; scanf("%d %d %d %d", &a, &b, &c, &d); printf("%d %d %d %d\n", a, b, c, d); scanf("%d", &e); printf("%d\n", e); return 0; }
预期:1 2 3 4
1 2 3 4
5
5
但是如果你这样输入: 1 2 3 4 5
会输出 1 2 3 4
5
这是因为scanf以回车键为信号,去缓冲区进行读取数据,只要数据的格式符合标准,那么就可以正确读取,否则就要等待继续输入/读取失败
通过查阅网站我们知道了,scanf函数是标准输入流(从键盘接收数据),接收的数据放入输入缓冲区中,其中就包括在键盘输入的空格、回车这类字符,
但是!!!
当你用%d接收时是不会影响的,但是用%c就会产生错误,这是因为在"%c"输入时,空格和转义字符均被视为有效字符会被%c接收。从而导致输出错误,无法AC
1.List item
可以再%c前 键入一个空格 (优解)
eg:scanf(" %c",&a);
这里 %c前面加上空格键 可以消除前面所有的空白字符(输入的时候就会消化掉这个\n) 从而 不需要使用getchar()去吞\n
并且不会为下次留下空白字符的隐患
2.使用getchar()去吞掉缓存区中的\n
while(ch=getchar()!=EOF) getchar();
使用getchar(); 去吞掉缓存区中剩余的 ‘\n' ,从而使程序可以正常运行