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

这篇具有很好参考价值的文章主要介绍了【C语言初阶篇】scanf和getchar中缓存区的概念!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


【C语言初阶篇】scanf和getchar中缓存区的概念!,《C语言初级篇》,c语言,c++,开发语言,算法,缓冲区

🎬 鸽芷咕:个人主页

 🔥 个人专栏:《C语言初阶篇》 《C语言进阶篇》
⛺️生活的理想,就是为了理想的生活!

前言

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

💬 getchar( )的用法讲解

📌 g e t c h a r ( ) getchar() getchar() 用来获取一个字符的

  • 在C++官方是这样描述的
    【C语言初阶篇】scanf和getchar中缓存区的概念!,《C语言初级篇》,c语言,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,就自动错了呢?
    【C语言初阶篇】scanf和getchar中缓存区的概念!,《C语言初级篇》,c语言,c++,开发语言,算法,缓冲区
    而这就是本期重点了,给大家讲一下函数缓冲区的概念。

💬键盘缓冲区

  • 给大家提一个问题难道想scanf和getchar这样的
  • 接收函数难道是直接从键盘上接收函数吗?
    【C语言初阶篇】scanf和getchar中缓存区的概念!,《C语言初级篇》,c语言,c++,开发语言,算法,缓冲区

⛳️说明:

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

  • scanfgetchar函数和键盘之间有一个键盘缓冲区
  • 键盘输入之后把数据放到缓冲区然后再进行读取
    【C语言初阶篇】scanf和getchar中缓存区的概念!,《C语言初级篇》,c语言,c++,开发语言,算法,缓冲区

scanf 演示

  • 📜说明:当我们缓存区如上图时什么都没有scanf( )函数就会等待
📖 运行错误的原因
  • 📌 而当我们输入123456然后换 缓存区中存的是123456加上\n这回车换行符
    【C语言初阶篇】scanf和getchar中缓存区的概念!,《C语言初级篇》,c语言,c++,开发语言,算法,缓冲区
  • 🌱 这时我们的scanf就会把缓冲区中的123456给存到数组中去。
  • 🌱 但是\n这个字符还是留了下来没被清理掉。
    【C语言初阶篇】scanf和getchar中缓存区的概念!,《C语言初级篇》,c语言,c++,开发语言,算法,缓冲区
    所以我们的getchar函数看到里面有内容。
    就不进行等待直接读取了。
    搜嘎这时我们程序出现错误的原因就找到了。

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

🎬 原因找到,实战开始!

📚 解决方法

📑 方法一:

  • 🌱 最简单的方法,我们单独放上一个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;
}

【C语言初阶篇】scanf和getchar中缓存区的概念!,《C语言初级篇》,c语言,c++,开发语言,算法,缓冲区

  • 📌但是这种代码只适合这一种场景,不全面没有完全解决问题。
  • 📌用我们的古话来说就是治标不治本。
  • 📌当我们换个场景输入 123456 abc 的时候又错误了

【C语言初阶篇】scanf和getchar中缓存区的概念!,《C语言初级篇》,c语言,c++,开发语言,算法,缓冲区

  • 我们来一起好好分析一下?

【C语言初阶篇】scanf和getchar中缓存区的概念!,《C语言初级篇》,c语言,c++,开发语言,算法,缓冲区

  • ⛳️而getchar只能清理一个字符所以会出现下面这种情况
    【C语言初阶篇】scanf和getchar中缓存区的概念!,《C语言初级篇》,c语言,c++,开发语言,算法,缓冲区

  • 我们的getchar直接就把b读取给input变量了 导致if判断为读取失败。

📑 方法二:

  • 🌱前面说了错误原因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;
}

循环解决缓冲区

总结

✅ 归纳:
好了以上就是关于getchar()函数的用法,和关于缓冲区的概念就讲完了!
  getchar的参数
  getchar的返回值
  EOF的讲解
  缓冲区概念的讲解
☁️ 学会这些大家就不会再为,scanf函数和getchar函数使用时找不到错误而发愁了!
看到这里了还不给博主扣个⛳️ 点赞☀️收藏 ⭐️ 关注
💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖
拜托拜托这个真的很重要!
你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。
【C语言初阶篇】scanf和getchar中缓存区的概念!,《C语言初级篇》,c语言,c++,开发语言,算法,缓冲区文章来源地址https://www.toymoban.com/news/detail-629335.html

到了这里,关于【C语言初阶篇】scanf和getchar中缓存区的概念!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【初阶C语言】学会使用库函数getchar和putchar

    目录 一、getchar函数 1.作用: 2.认识函数 3.运用 二、putchar函数 1.作用 2.定义 3.运用 三、getchar与putchar的运用 四、getchar的应用 1.作用:       该函数的作用是 接收一个字符 ,然后把该字符 转化对应的ASCII值 2.认识函数  参数类型:括号里面的void意思是 不接受参数 ,就是括

    2024年02月15日
    浏览(36)
  • 【C语言初阶篇】for语句的基本语法和使用规则!

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 :《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位宝子们大家好啊,前面给大家详细介绍了while语句但是它也是有缺点的,所以我们就有了更好的语法for!    ⛳️ 那么今天我们就介绍一下

    2024年02月14日
    浏览(36)
  • 【C语言初阶篇】 while 语句的语法和注意事项 (详解版)

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 :《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位宝子们大家好啊,又是新的一天开始了,今天给大家带来的循环语句的全面讲解!    ⛳️ 历时一天终于给肝出来了,本文详细讲解了wh

    2024年02月14日
    浏览(40)
  • 《C语言初阶篇》循环语句还没搞懂?这篇文章带你轻松学会循环语句!

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 :《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位宝子们大家好啊,又是新的一天开始了,今天给大家带来的循环语句的全面讲解!    ⛳️ 历时一天终于给肝出来了,本文详细讲解了wh

    2024年02月15日
    浏览(40)
  • C语言初阶--连用scanf(以%c读取时)遇到的问题

    在我们写程序的过程中,会频繁使用scanf函数,当在一个程序中scanf用多了,会出现输入不了的问题!大家有没有想过是什么原因导致的该问题呢?下面我们一起探讨一下吧! 遇到问题的例子: 代码运行的结果: 调试的结果为: 描述问题: 我们在输入第一个字符‘a’的时候

    2023年04月18日
    浏览(28)
  • 《C语言初阶篇》听说你还不会for循环的变种写法?一文教你彻底搞懂循环语句!

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 :《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位宝子们大家好啊,前面给大家详细介绍了while语句但是它也是有缺点的,所以我们就有了更好的语法for!    ⛳️ 那么今天我们就介绍一下

    2024年02月16日
    浏览(38)
  • 【初阶C语言】关于scanf函数的超详细介绍和多组输入

    感谢各位可以光临娥子的作品   我们学习一个函数,要围绕三个点 :1.函数是什么  2.函数的用法   3.注意的细节 认识一个 函数,我们需要了解他的功能、返回值、接收的参数三个方面 函数原型  (1)功能介绍          scanf函数是一个输入函数 ,所以接收的参数类型需

    2024年02月08日
    浏览(45)
  • 《C和指针》笔记6:gets/puts/scanf/printf/getchar函数用法

    本博客可以了解一些gets/puts/scanf/printf/getchar函数的基本用法。 gets 函数从标准输入读取一行文本并把它存储于作为参数传递给它的数组中。 一行输入由一串字符组成,以一个换行符(newline)结尾 。 gets 函数 丢弃换行符 ,并在该行的末尾存储一个NUL字节(一个NUL字节是指字节模

    2024年02月11日
    浏览(43)
  • JavaEE 初阶篇-生产者与消费者模型(线程通信)

    🔥博客主页: 【 小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍   文章目录         1.0 生产者与消费者模型概述         2.0 在生产者与消费者模型中涉及的关键概念         2.1 缓冲区         2.2 生产者         2.3 消费者         2.4 同步机制         2.5 线程间通

    2024年04月28日
    浏览(36)
  • JavaEE 初阶篇-深入了解多线程等待与多线程状态

    🔥博客主页: 【 小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录         1.0 线程等待         1.1 线程等待 - join() 方法         1.1.1 main 线程中等待多个线程         1.1.2 main 线程等待 t2 线程且t2 线程等待 t1 线程         1.1.3 其他线程阻塞等待 main 线程

    2024年04月17日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包