前言
🌈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,就自动错了呢?
而这就是本期重点了,给大家讲一下函数缓冲区的概念。