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

 更新时间:2021年09月13日 11:02:17   作者:顾冷__  
scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息,接下来通过本文给大家介绍C语言中关于scanf读取缓存区的问题,需要的朋友一起看看吧

前言

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

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

根据 cplusplus.com的解释

请添加图片描述

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

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

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

while(ch=getchar()!=EOF)

​		getchar();

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

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

相关文章

  • 使用C语言实现最小生成树求解的简单方法

    使用C语言实现最小生成树求解的简单方法

    这篇文章主要介绍了使用C语言实现最小生成树求解的简单方法,包括Prim算法和Kruskal算法的两种求解方式,需要的朋友可以参考下
    2015-08-08
  • C语言中main函数两个参数的作用

    C语言中main函数两个参数的作用

    这篇文章主要介绍了C语言中main函数两个参数的作用,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • C语言解决百钱买百鸡问题

    C语言解决百钱买百鸡问题

    本文给大家分享的是一个经典的算法(百元百鸡)的C语言版的解决方法,使用的是比较偷懒的穷举法,有需要的小伙伴可以参考下。
    2016-02-02
  • C++基础入门教程(四):枚举和指针

    C++基础入门教程(四):枚举和指针

    这篇文章主要介绍了C++基础入门教程(四):枚举和指针,本文重点讲解了指针,有幽默搞笑的语言描述了指针,需要的朋友可以参考下
    2014-11-11
  • C语言指针引用数组案例讲解

    C语言指针引用数组案例讲解

    这篇文章主要介绍了C语言指针引用数组案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • c语言多线程编程使用示例

    c语言多线程编程使用示例

    这篇文章主要介绍了c语言多线程编程使用示例,需要的朋友可以参考下
    2014-04-04
  • C语言详细分析不同类型数据在内存中的存储

    C语言详细分析不同类型数据在内存中的存储

    使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着,当您创建一个变量时,就会在内存中保留一些空间。您可能需要存储各种数据类型的信息,操作系统会根据变量的数据类型,来分配内存和决定在保留内存中存储什么
    2022-08-08
  • C语言解字符串逆序和单向链表逆序问题的代码示例

    C语言解字符串逆序和单向链表逆序问题的代码示例

    这篇文章主要介绍了C语言解字符串逆序和单向链表逆序问题的代码示例,求逆序也是考研和面试中的基础算法题类型,需要的朋友可以参考下
    2016-06-06
  • 详解C++中常用的四种类型转换方式

    详解C++中常用的四种类型转换方式

    这篇文章主要为大家详细介绍了C++中常用的四种类型转换方式:static_cast<Type>、dynamic_cast<Type>、const_case<Type>和reinterpret_cast,感兴趣的可以了解一下
    2022-08-08
  • C语言宏定义使用分析

    C语言宏定义使用分析

    在宏定义中,“宏名称”和“宏字符串”是通过“空格”来区分的,某些朋友不要混淆了,接下来请祥看本文
    2012-12-12

最新评论