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

时间:2022-09-27 19:02:10

前言

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

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

根据 cplusplus.com的解释

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

scanf函数的定义

scanf()函数是通用 终端格式化输入 函数,它从标准输入设备(键盘)
读取输入的信息。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。 其调用格式为:
scanf("<格式化字符串>",<地址表>);

功能:执行格式化输入

并且注意:scanf()函数返回成功赋值的数据项数,出错时则返回EOF。

当进一步深挖之后(暂时不需要知道原理,只需要知道结果即可),
可以得到这样一个认识:
键盘输入的东西并没有直接给scanf读取 而是在缓冲区进行暂时存放
比如这样一段代码:

?
1
2
3
4
5
6
7
8
9
10
#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前 键入一个空格 (优解)

?
1
eg:scanf(" %c",&a);

这里 %c前面加上空格键 可以消除前面所有的空白字符(输入的时候就会消化掉这个\n) 从而 不需要使用getchar()去吞\n

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

2.使用getchar()去吞掉缓存区中的\n

?
1
2
3
while(ch=getchar()!=EOF)
 
​       getchar();

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

到此这篇关于C语言中关于scanf读取缓存区的问题的文章就介绍到这了,更多相关C语言scanf缓存区内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/GuLeng______/article/details/120241297