scanf和getchar大家都用过吧!那么缓存区的概念你必须了解!(下)

简介: scanf和getchar大家都用过吧!那么缓存区的概念你必须了解!(下)

💬键盘缓冲区

  • 给大家提一个问题难道想scanf和getchar这样的
  • 接收函数难道是直接从键盘上接收函数吗?

⛳️说明:

👑 其实他们之间还有一个函数缓冲区的概念。

  • scanfgetchar函数和键盘之间有一个键盘缓冲区
  • 键盘输入之后把数据放到缓冲区然后再进行读取

scanf 演示

  • 📜说明:当我们缓存区如上图时什么都没有scanf( )函数就会等待
📖 运行错误的原因
  • 📌 而当我们输入123456然后换 缓存区中存的是123456加上\n这回车换行符
  • 🌱 这时我们的scanf就会把缓冲区中的123456给存到数组中去。
  • 🌱 但是\n这个字符还是留了下来没被清理掉。

    所以我们的getchar函数看到里面有内容。
    就不进行等待直接读取了。
    搜嘎这时我们程序出现错误的原因就找到了。

原因找到,就好解决了,既然是换行符\n被清理了导致的。

那么我们就把\n提前清理就好了。

🎬 原因找到,实战开始!

📚 解决方法

📑 方法一:

  • 🌱 最简单的方法,我们单独放上一个getchar()把换行符\n提前读取了就好了
#include <stdio.h>
int main()
{
  //123456
  char password[20] = {0};
  printf("请输入密码:>");
  scanf("%s", password);//123456 abc
  printf("请确认密码(Y/N):");
  char input = 0;
  getchar();//\n
  if ('Y' == input)
    printf("确认成功\n");
  else
    printf("确认失败\n");
  return 0;
}

  • 📌但是这种代码只适合这一种场景,不全面没有完全解决问题。
  • 📌用我们的古话来说就是治标不治本。
  • 📌当我们换个场景输入 123456 abc 的时候又错误了

  • 我们来一起好好分析一下?

  • ⛳️而getchar只能清理一个字符所以会出现下面这种情况

  • 我们的getchar直接就把b读取给input变量了导致if判断为读取失败。

📑 方法二:

  • 🌱前面说了错误原因getchar( )只读取了一个字符,那么用循环清理掉多个字符不就好了。
  • 🌱让getchar() 只要没有读取错误就一直循环!就完美解决错误啦!
#include <stdio.h>
int main()
{
  //123456
  char password[20] = {0};
  printf("请输入密码:>");
  scanf("%s", password);//123456 abc
  printf("请确认密码(Y/N):");
  char input = 0;
  //清理掉缓冲区中剩余的数据
  while (getchar() != '\n')
  {
    ;
  }
  input = getchar();
  if ('Y' == input)
    printf("确认成功\n");
  else
    printf("确认失败\n");
  return 0;
}

循环解决缓冲区

总结

✅ 归纳:

好了以上就是关于getchar()函数的用法,和关于缓冲区的概念就讲完了!

  getchar的参数

  getchar的返回值

  EOF的讲解

  缓冲区概念的讲解

☁️ 学会这些大家就不会再为,scanf函数和getchar函数使用时找不到错误而发愁了!

看到这里了还不给博主扣个⛳️ 点赞☀️收藏 ⭐️ 关注

💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖

拜托拜托这个真的很重要!

你们的点赞就是博主更新最大的动力!

有问题可以评论或者私信呢秒回哦。

目录
相关文章
|
1月前
|
缓存 分布式计算 NoSQL
大数据-47 Redis 缓存过期 淘汰删除策略 LRU LFU 基础概念
大数据-47 Redis 缓存过期 淘汰删除策略 LRU LFU 基础概念
65 2
|
存储 缓存 vr&ar
scanf和getchar大家都用过吧!那么缓存区的概念你必须了解!(上)
scanf和getchar大家都用过吧!那么缓存区的概念你必须了解!
78 0
|
存储 缓存 NoSQL
Redis缓存穿透和雪崩相关概念(面试高频,工作常用)
Redis缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面,但同时,它也带来了一些问题,其中,最重要的问题,就是数据的一致性问题。从严格意义上讲,这个无解。如果对数据的一致性要求很高,那么就不能使用缓存。
153 0
Redis缓存穿透和雪崩相关概念(面试高频,工作常用)
|
缓存 NoSQL 算法
Redis缓存数据库应用概念以及Redis基本操作(一)
redis基本概念及部署redis 1.redis介绍 rediis是一种基于键值对的NoSQL数据库,与很多键值对数据库不同,redis中的值可以有string、hash、list、set、zset、geo等多种数据结构和算法组成。
349 0
Redis缓存数据库应用概念以及Redis基本操作(一)
|
缓存 NoSQL Redis
Redis中缓存雪崩、缓存穿透、缓存降级等概念的简单说明
Redis中缓存雪崩、缓存穿透、缓存降级等概念的简单说明(言简意赅,不啰嗦): 1、缓存雪崩:缓存集中过期,新缓存还没能刷入进来,导致所有请求(查询)都走数据库,给数据库内存和CPU巨大压力,严重导致数据库宕机,进而造成系统崩溃。
2138 0
|
1月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
74 6
|
9天前
|
缓存 NoSQL 关系型数据库
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
本文详解缓存雪崩、缓存穿透、缓存并发及缓存预热等问题,提供高可用解决方案,帮助你在大厂面试和实际工作中应对这些常见并发场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题