hello! 各位宝子们大家好啊,相信大家都多多少少了用过scanf和getchar()语句吧,但是关于缓存区的概念,我相信大多数人都没有听说过吧。
⛳️写这篇文章的原因是博主在写代码过程中,被一个一直提示的错误给难到了,然后百思不得其解。所以分享出来让大家在写代码的时候避免那些错误!
本期文章收录在《C语言初阶篇》,大家有兴趣可以看看呐!
⛺️ 欢迎铁汁们 ✔️ 点赞 收藏 ⭐留言 !
g e t c h a r ( ) getchar() getchar() 用来获取一个字符的
返回成功时
这里写着,成功后返回值为int类型。
而我们字符在存储是也是用**ASCLL
**码存储的,也是整数所以用int接收返回值。
返回错误时
返回类型为 int 以适应特殊值 EOF
,该值指示失败:
那么怎么样返回错误呢?
ctrl+z
会让 scanf
或者 getchar
返回EOF就可以啦!
EOF是什么意思呢!
- 在C语言中是这样规定的
- #define EOF (-1)
- 由 #define 定义的EOF为(-1),所以当函数返回EOF时就是返回(-1)。
⛳️ 前面我们说了,当
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()
函数,读取一个字符在输出。
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()
的用法就讲清楚了。
✅ 模板:
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
进行判断,输出密码输入失败还是成功
废话不多说运行一下便知真晓
运行结果
⛳️说明:
其实他们之间还有一个函数缓冲区的概念。
scanf 演示
- 说明:当我们缓存区如上图时什么都没有
scanf( )
函数就会等待
- 这时我们的scanf就会把缓冲区中的123456给存到数组中去。
- 但是\n这个字符还是留了下来没被清理掉。
所以我们的getchar函数看到里面有内容。
就不进行等待直接读取了。
搜嘎这时我们程序出现错误的原因就找到了。原因找到,就好解决了,既然是换行符\n被清理了导致的。
那么我们就把\n提前清理就好了。
原因找到,实战开始!
方法一:
#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
的时候又错误了
方法二:
#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函数使用时找不到错误而发愁了!
看到这里了还不给博主扣个⛳️ 点赞
☀️收藏
⭐️ 关注
!
❤️
拜托拜托这个真的很重要!
你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。