C语言中关于Scanf读取缓存区的问题

前言

在牛客做了很多坑爹的题,明明代码没问题但是就退无法AC,看了很多题解之后,发现是scanf读取缓存区,在输入输出时出现了问题 于是写个博客总结一下

首先我们要了解什么是 scanf 函数

根据 cplusplus.com的解释

3BA55938-D1E5-F8D7-856D-B700DE65B128.png

scanf函数的定义:

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

并且不会为下次留下空白字符的隐患

  1. 使用getchar()去吞掉缓存区中的\n
while(ch=getchar()!=EOF)

​		getchar();

使用getchar(); 去吞掉缓存区中剩余的 ‘\n’ ,从而使程序可以正常运行

欢迎大家点赞,评论,指出不足与错误。

收藏 (0)
评论列表
正在载入评论列表...
我是有底线的
为您推荐
    暂时没有数据