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大家都用过吧!那么缓存区的概念你必须了解!(下)
55 0
|
存储 缓存 NoSQL
Redis缓存穿透和雪崩相关概念(面试高频,工作常用)
Redis缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面,但同时,它也带来了一些问题,其中,最重要的问题,就是数据的一致性问题。从严格意义上讲,这个无解。如果对数据的一致性要求很高,那么就不能使用缓存。
134 0
Redis缓存穿透和雪崩相关概念(面试高频,工作常用)
|
缓存 NoSQL 算法
Redis缓存数据库应用概念以及Redis基本操作(一)
redis基本概念及部署redis 1.redis介绍 rediis是一种基于键值对的NoSQL数据库,与很多键值对数据库不同,redis中的值可以有string、hash、list、set、zset、geo等多种数据结构和算法组成。
295 0
Redis缓存数据库应用概念以及Redis基本操作(一)
|
缓存 NoSQL Redis
Redis中缓存雪崩、缓存穿透、缓存降级等概念的简单说明
Redis中缓存雪崩、缓存穿透、缓存降级等概念的简单说明(言简意赅,不啰嗦): 1、缓存雪崩:缓存集中过期,新缓存还没能刷入进来,导致所有请求(查询)都走数据库,给数据库内存和CPU巨大压力,严重导致数据库宕机,进而造成系统崩溃。
2095 0
|
2天前
|
缓存 NoSQL 中间件
【后端面经】【缓存】36|Redis 单线程:为什么 Redis 用单线程而 Memcached 用多线程?epoll、poll和select + Reactor模式
【5月更文挑战第19天】`epoll`、`poll`和`select`是Linux下多路复用IO的三种方式。`select`需要主动调用检查文件描述符,而`epoll`能实现回调,即使不调用`epoll_wait`也能处理就绪事件。`poll`与`select`类似,但支持更多文件描述符。面试时,重点讲解`epoll`的高效性和`Reactor`模式,该模式包括一个分发器和多个处理器,用于处理连接和读写事件。Redis采用单线程模型结合`epoll`的Reactor模式,确保高性能。在Redis 6.0后引入多线程,但基本原理保持不变。
21 2
|
3天前
|
缓存 NoSQL Redis
【后端面经】【缓存】36|Redis 单线程:为什么 Redis 用单线程而 Memcached 用多线程?--epoll调用和中断
【5月更文挑战第18天】`epoll`包含红黑树和就绪列表,用于高效管理文件描述符。关键系统调用有3个:`epoll_create()`创建epoll结构,`epoll_ctl()`添加/删除/修改文件描述符,`epoll_wait()`获取就绪文件描述符。`epoll_wait()`可设置超时时间(-1阻塞,0立即返回,正数等待指定时间)。当文件描述符满足条件(如数据到达)时,通过中断机制(如网卡或时钟中断)更新就绪列表,唤醒等待的进程。
32 6