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

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

前言

   🌈hello! 各位宝子们大家好啊,相信大家都多多少少了用过scanf和getchar()语句吧,但是关于缓存区的概念,我相信大多数人都没有听说过吧。

   ⛳️写这篇文章的原因是博主在写代码过程中,被一个一直提示的错误给难到了,然后百思不得其解。所以分享出来让大家在写代码的时候避免那些错误!

   📚本期文章收录在《C语言初阶篇》,大家有兴趣可以看看呐

  ⛺️ 欢迎铁汁们 ✔️ 点赞 👍 收藏 ⭐留言 📝!

💬 getchar( )的用法讲解

📌 g e t c h a r ( ) getchar()getchar() 用来获取一个字符的

  • 在C++官方是这样描述的
📑getchar()的参数
  • 🌱 这里我们可以看到 getchar() 的参数是 void 空类型
  • 🌱就是没有参数的意思,不需要参数。
📑getchar()的返回值
  • 返回成功时
  • 🌱这里写着,成功后返回值为int类型。
  • 🌱而我们字符在存储是也是用**ASCLL**码存储的,也是整数所以用int接收返回值。
  • 返回错误时
  • 🌱返回类型为 int 以适应特殊值 EOF该值指示失败:
  • 🌱那么怎么样返回错误呢?
  • 🌱ctrl+z会让 scanf 或者 getchar 返回EOF就可以啦!

🌲 EOF是什么意思呢!

  • 🐲 在C语言中是这样规定的
  • 🐲 #define EOF (-1)
  • 🐲 由 #define 定义的EOF为(-1),所以当函数返回EOF时就是返回(-1)。
💬为什么getchar的返回值是个整形int而不是char

⛳️ 前面我们说了,当getchar()读取错误时返回的是EOF

  • EOF在C语言中被定义为-1,而-1是字符char是存储不下的

💭 扩展:原反补的概念

🌱给大家扩展一下一个整数在C语言中存的是他的补码

⛳️ 原码就是它本身转化成二进制

⛳️ 反码按位取反 同0取1 同1取0

⛳️ 补码 反码加1

而-1的补码是:

  • -1的原码: 00000000 00000000 00000000 00000001
  • -1的反码: 11111111 11111111 11111111 11111110
  • -1的补码: 11111111 11111111 11111111 11111111

    而charl类型只能存储8个1,放不下32个1.

所以我们是getcahr()的返回值用是int是不是好一些,而不是char

📚 getchar( )实例应用:

📑 示例一:

这里就是getchar()函数,读取一个字符在输出。

int main()
{
  int ch = getchar();//输入A
  printf("%c\n", ch);//已字符形式打印字符A
  putchar(ch);//打印字符
  return 0;
}

📑示例二:

这里演示一下用循环重复读取字符呢。

int main()
{
  int ch = 0;
  while ((ch = getchar()) != EOF)
  {
    putchar(ch);
  }
  return 0;
}

⛳️好了以上就getchar()的用法就讲清楚了。

💬scanf函数的讲解

  • scanf函数博主前一篇文章详细讲解过呢!
  • 大家可以去看一下,里面详细讲解了scanf函数的细节!
  • 注:下面蓝色文字就是链接呢!
  • scanf函数详解

💬 getchar 和 scanf 用法错误实例:

✅ 模板:

int main()
{
  //123456
  char password[20] = {0};
  printf("请输入密码:>");
  scanf("%s", password);//123456
  printf("请确认密码(Y/N):");
  char input = 0;
  input = getchar();
  if ('Y' == input)
    printf("确认成功\n");
  else
    printf("确认失败\n");
  return 0;
}

🌲 大家看这段码是不逻辑上一点问题都没有?

  • 🌱 定义一个字符数组接收密码
  • 🌱 然后定义一个input接收确认密码的整数
  • 🌱 之后用 if 进行判断,输出密码输入失败还是成功
💭 运行结果:

废话不多说运行一下便知真晓

运行结果

  • 大家看这里是不是和博主有一样的疑惑?
  • 怎么还没有按Y和N,就自动错了呢?

    而这就是本期重点了,给大家讲一下函数缓冲区的概念。


目录
相关文章
|
存储 缓存 算法
Edge Cache(边缘缓存) 的概念
Edge Cache(边缘缓存) 的概念
|
10月前
|
缓存
scanf和getchar大家都用过吧!那么缓存区的概念你必须了解!(下)
scanf和getchar大家都用过吧!那么缓存区的概念你必须了解!(下)
54 0
|
存储 缓存 NoSQL
Redis缓存穿透和雪崩相关概念(面试高频,工作常用)
Redis缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面,但同时,它也带来了一些问题,其中,最重要的问题,就是数据的一致性问题。从严格意义上讲,这个无解。如果对数据的一致性要求很高,那么就不能使用缓存。
132 0
Redis缓存穿透和雪崩相关概念(面试高频,工作常用)
|
缓存 NoSQL 算法
Redis缓存数据库应用概念以及Redis基本操作(一)
redis基本概念及部署redis 1.redis介绍 rediis是一种基于键值对的NoSQL数据库,与很多键值对数据库不同,redis中的值可以有string、hash、list、set、zset、geo等多种数据结构和算法组成。
292 0
Redis缓存数据库应用概念以及Redis基本操作(一)
|
缓存 NoSQL Redis
Redis中缓存雪崩、缓存穿透、缓存降级等概念的简单说明
Redis中缓存雪崩、缓存穿透、缓存降级等概念的简单说明(言简意赅,不啰嗦): 1、缓存雪崩:缓存集中过期,新缓存还没能刷入进来,导致所有请求(查询)都走数据库,给数据库内存和CPU巨大压力,严重导致数据库宕机,进而造成系统崩溃。
2085 0
|
7天前
|
存储 缓存 NoSQL
【Go语言专栏】Go语言中的Redis操作与缓存应用
【4月更文挑战第30天】本文探讨了在Go语言中使用Redis进行操作和缓存应用的方法。文章介绍了Redis作为高性能键值存储系统,用于提升应用性能。推荐使用`go-redis/redis`库,示例代码展示了连接、设置、获取和删除键值对的基本操作。文章还详细阐述了缓存应用的步骤及常见缓存策略,包括缓存穿透、缓存击穿和缓存雪崩的解决方案。利用Redis和合适策略可有效优化应用性能。
|
10天前
|
存储 缓存 NoSQL
Redis多级缓存指南:从前端到后端全方位优化!
本文探讨了现代互联网应用中,多级缓存的重要性,特别是Redis在缓存中间件的角色。多级缓存能提升数据访问速度、系统稳定性和可扩展性,减少数据库压力,并允许灵活的缓存策略。浏览器本地内存缓存和磁盘缓存分别优化了短期数据和静态资源的存储,而服务端本地内存缓存和网络内存缓存(如Redis)则提供了高速访问和分布式系统的解决方案。服务器本地磁盘缓存因I/O性能瓶颈和复杂管理而不推荐用于缓存,强调了内存和网络缓存的优越性。
29 1