【C语言初阶篇】scanf和getchar中缓存区的概念! 您所在的位置:网站首页 getchar读取换行符 【C语言初阶篇】scanf和getchar中缓存区的概念!

【C语言初阶篇】scanf和getchar中缓存区的概念!

2024-07-01 19:35| 来源: 网络整理| 查看: 265

在这里插入图片描述在这里插入图片描述

🎬 鸽芷咕:个人主页 🔥 个人专栏:《C语言初阶篇》 《C语言进阶篇》

⛺️生活的理想,就是为了理想的生活!

文章目录前言💬 getchar( )的用法讲解📑getchar()的参数📑getchar()的返回值💬为什么getchar的返回值是个整形int而不是char📚 getchar( )实例应用:💬scanf函数的讲解💬 getchar 和 scanf 用法错误实例:💭 运行结果:💬键盘缓冲区📖 运行错误的原因📚 解决方法总结前言

🌈hello! 各位宝子们大家好啊,相信大家都多多少少了用过scanf和getchar()语句吧,但是关于缓存区的概念,我相信大多数人都没有听说过吧。 ⛳️写这篇文章的原因是博主在写代码过程中,被一个一直提示的错误给难到了,然后百思不得其解。所以分享出来让大家在写代码的时候避免那些错误! 📚本期文章收录在《C语言初阶篇》,大家有兴趣可以看看呐! ⛺️ 欢迎铁汁们 ✔️ 点赞 👍 收藏 ⭐留言 📝!

💬 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()函数,读取一个字符在输出。

代码语言:javascript复制int main() { int ch = getchar();//输入A printf("%c\n", ch);//已字符形式打印字符A putchar(ch);//打印字符 return 0; }

📑示例二:

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

代码语言:javascript复制int main() { int ch = 0; while ((ch = getchar()) != EOF) { putchar(ch); } return 0; }

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

💬scanf函数的讲解scanf函数博主前一篇文章详细讲解过呢! 大家可以去看一下,里面详细讲解了scanf函数的细节!注:下面蓝色文字就是链接呢!scanf函数详解💬 getchar 和 scanf 用法错误实例:

✅ 模板:

代码语言:javascript复制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,就自动错了呢? 在这里插入图片描述在这里插入图片描述

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

💬键盘缓冲区给大家提一个问题难道想scanf和getchar这样的接收函数难道是直接从键盘上接收函数吗? 在这里插入图片描述在这里插入图片描述

⛳️说明:

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

scanf和getchar函数和键盘之间有一个键盘缓冲区键盘输入之后把数据放到缓冲区然后再进行读取 在这里插入图片描述在这里插入图片描述

scanf 演示

📜说明:当我们缓存区如上图时什么都没有scanf( )函数就会等待📖 运行错误的原因📌 而当我们输入123456然后换 缓存区中存的是123456加上\n这回车换行符 在这里插入图片描述在这里插入图片描述

🌱 这时我们的scanf就会把缓冲区中的123456给存到数组中去。🌱 但是\n这个字符还是留了下来没被清理掉。 在这里插入图片描述在这里插入图片描述

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

原因找到,就好解决了,既然是换行符\n被清理了导致的。 那么我们就把\n提前清理就好了。

🎬 原因找到,实战开始!

📚 解决方法

📑 方法一:

🌱 最简单的方法,我们单独放上一个getchar()把换行符\n提前读取了就好了代码语言:javascript复制#include 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() 只要没有读取错误就一直循环!就完美解决错误啦!代码语言:javascript复制#include 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函数使用时找不到错误而发愁了! 看到这里了还不给博主扣个⛳️ 点赞☀️收藏 ⭐️ 关注! 💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖 拜托拜托这个真的很重要! 你们的点赞就是博主更新最大的动力! 有问题可以评论或者私信呢秒回哦。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有