(文章目录)
前言
<font color = green > 🌈hello! 各位宝子们大家好啊,相信大家都多多少少了用过scanf和getchar()语句吧,但是关于缓存区的概念,我相信大多数人都没有听说过吧。</font> <font color = green > ⛳️写这篇文章的原因是博主在写代码过程中,被一个一直提示的错误给难到了,然后百思不得其解。所以分享出来让大家在写代码的时候避免那些错误!</font> <font color = Orange > 📚本期文章收录在《C语言初阶篇》,大家有兴趣可以看看呐!</font> <font color = purple>:tent: 欢迎铁汁们 :heavy_check_mark: 点赞 👍 收藏 ⭐留言 📝!</font>
💬 getchar( )的用法讲解
📌 $getchar()$ <font color = purple>用来获取一个字符的</font>
- 在C++官方是这样描述的
📑getchar()的参数
- 🌱 这里我们可以看到 <font color = purple>getchar() </font>的参数是 <font color = Orange>void</font> 空类型
- 🌱就是没有参数的意思,不需要参数。
📑getchar()的返回值
-
[ ] <font color = red>返回成功时</font>
-
🌱这里写着,成功后返回值为int类型。
-
🌱而我们字符在存储是也是用**
ASCLL
**码存储的,也是整数所以用int接收返回值。 -
[x] <font color = red> 返回错误时</font>
-
🌱返回类型为 int 以适应特殊值
EOF
,==该值指示失败:== -
🌱那么怎么样返回错误呢?
-
🌱
ctrl+z
会让scanf
或者getchar
返回EOF就可以啦!
🌲 <font color = purple size=4 >EOF是什么意思呢!</font>
- 🐲 <font color="#00dd00">在C语言中是这样规定的</font>
- 🐲 <kbd>#define EOF (-1)</kbd>
- 🐲 <font color="#dd00dd">由 #define 定义的EOF为(-1),所以当函数返回EOF时就是返回(-1)。</font>
💬为什么getchar的返回值是个整形int而不是char
⛳️ <font color="#dd0000">前面我们说了,当
getchar()
读取错误时返回的是EOF
</font>
- <font color="#660066">而
EOF
在C语言中被定义为-1
,而-1
是字符char是存储不下的</font>
💭 <font color = Orange size=4>扩展:原反补的概念</font>
🌱<font color = red>给大家扩展一下一个整数在C语言中存的是他的补码</font> ⛳️ <font color = "#660000">原码就是它本身转化成二进制 </font> ⛳️ <font color = "#660000">反码按位取反 同0取1 同1取0 </font> ⛳️ <font color = "#660000">补码 反码加1 </font> <font color = Orange size=3>而-1的补码是:</font>
- -1的原码: 00000000 00000000 00000000 00000001
- -1的反码: 11111111 11111111 11111111 11111110
- -1的补码: 11111111 11111111 11111111 11111111 </br> ==而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函数的讲解
- <font color ="7B68EE" size=4 ><strong>scanf函数博主前一篇文章详细讲解过呢!</strong> </font>
- ==大家可以去看一下,里面详细讲解了scanf函数的细节!==
- 注:<font color="#dd0000">下面蓝色文字就是链接呢!</font>
- 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;
}
🌲 <font color="#dd0000">大家看这段码是不逻辑上一点问题都没有?</font>
- 🌱 定义一个字符数组接收密码
- 🌱 然后定义一个
input
接收确认密码的整数- 🌱 之后用
if
进行判断,输出密码输入失败还是成功
💭 运行结果:
<font color = purple size=4>废话不多说运行一下便知真晓</font>
[video(video-omQCKUNn-1688351805956)(type-csdn)(url-https://live.csdn.net/v/embed/308537)(image-https://video-community.csdnimg.cn/vod-84deb4/21172dd0174a71ee80337035d0b20102/snapshots/2a224ce9639e4ea382ae5491fc4afbf2-00001.jpg?auth_key=4841731771-0-0-57a99084f338b51d53b71faca3b226ae)(title-运行结果)]
- <font color="#dd0000">大家看这里是不是和博主有一样的疑惑?</font>
- <font color="#dd0000">怎么还没有按Y和N,就自动错了呢?</font> <font color = Orange size=4>而这就是本期重点了,给大家讲一下函数缓冲区的概念。</font>
💬键盘缓冲区
- 给大家提一个问题难道想scanf和getchar这样的
- 接收函数难道是直接从键盘上接收函数吗?
⛳️说明:
👑 其实他们之间还有一个函数缓冲区的概念。
scanf
和getchar
函数和键盘之间有一个键盘缓冲区- 键盘输入之后把数据放到缓冲区然后再进行读取
[video(video-NMFRRPeK-1688354385313)(type-csdn)(url-https://live.csdn.net/v/embed/308546)(image-https://video-community.csdnimg.cn/vod-84deb4/d4a22fa0175271ee8c626732b78e0102/snapshots/83da25fa38af40ecb08ccb8b1bc87e8f-00001.jpg?auth_key=4841735508-0-0-c209d0a26d95251e4cf68f070bb63d7b)(title-scanf 演示)]
- 📜<font color="#006666">说明:当我们缓存区如上图时什么都没有
scanf( )
函数就会等待</font>
📖 运行错误的原因
- 📌 而当我们输入
123456
然后换 缓存区中存的是123456
加上\n
这回车换行符
- 🌱 <font color = green size=3.2>这时我们的scanf就会把缓冲区中的123456给存到数组中去。</font>
- 🌱 <font color = green size=3.2>但是\n这个字符还是留了下来没被清理掉。</font> <font color="#660000"> 所以我们的getchar函数看到里面有内容。</font> <font color="#660000">就不进行等待直接读取了。</font> ==***搜嘎这时我们程序出现错误的原因就找到了。***==
<font color="#00dd00" size=4>原因找到,就好解决了,既然是换行符\n被清理了导致的。</font> <font color="#00dd00" size=4>那么我们就把\n提前清理就好了。</font>
🎬<font color = Orange> 原因找到,实战开始! </font>
📚 解决方法
📑 方法一:
- 🌱 最简单的方法,我们单独放上一个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;
}
- 📌<font color="#dd0000">但是这种代码只适合这一种场景,不全面没有完全解决问题。</font>
- 📌<font color="#dd0000">用我们的古话来说就是治标不治本。</font>
- 📌<font color="#666600">当我们换个场景输入
123456 abc
的时候又错误了</font>
- <font color = purple size=4>我们来一起好好分析一下?</font>
⛳️<font color = green szie=3.9>而getchar只能清理一个字符所以会出现下面这种情况</font>
<font color="#660066">我们的getchar直接就把b读取给input变量了 </font><font color="#dd0000">导致if判断为读取失败。</font>
📑 方法二:
- 🌱前面说了错误原因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;
}
[video(video-vDNqAWq7-1688373278588)(type-csdn)(url-https://live.csdn.net/v/embed/308842)(image-https://video-community.csdnimg.cn/vod-84deb4/9af64750195571ee80316733a78e0102/snapshots/3a18d0a27ddc467c87035d4787bb5e9e-00001.jpg?auth_key=4841956602-0-0-0a9ceb9a36de70cf129ce9b6bda5e644)(title-循环解决缓冲区)]
总结
✅ 归纳: 好了以上就是关于getchar()函数的用法,和关于缓冲区的概念就讲完了! getchar的参数
getchar的返回值
EOF的讲解
缓冲区概念的讲解
:cloud: <font color="#006666">学会这些大家就不会再为,scanf函数和getchar函数使用时找不到错误而发愁了!</font> <font color = Orange>看到这里了还不给博主扣个⛳️ 点赞
:sunny:收藏
:star: 关注
!</font> 💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖 <font size = 5 face = "华文彩云" color =red>拜托拜托这个真的很重要!</font> <font color="#660066">你们的点赞就是博主更新最大的动力!</font> <font color="#660066">有问题可以评论或者私信呢秒回哦。</font>