getchar与scanf的读取原理

本文详细探讨了C语言中getchar和scanf函数的使用,解释了它们如何从缓冲区读取数据,并通过实例分析了这两个函数在处理输入时可能出现的问题。通过两个实例,阐述了如何避免额外字符干扰输入判断,并提供了改进代码的方法。
摘要由CSDN通过智能技术生成

目录

前言

一、函数定义

二、函数读取数据的方式

三、scanf与getchar的使用实例

实例二

实例二

总结


前言

想必大家在初学c语言时为了能输入输出一些自己想达到的效果,都用过getchar和scanf等IO函数吧,今天我们就来深入理解一些这两个函数。

一、函数定义

首先我们看一下这两个函数的相关信息

二、函数读取数据的方式

getchar和scanf在读取函数时并不是直接从键盘读取数据的,而是键盘输入的数据先传到缓冲区,函数再从缓冲区中读取其中的数据。

三、scanf与getchar的使用实例

实例二

#include <stdio.h>
int main()
{
	int ch = 0;
	while ((ch = getchar()) != EOF)
	{
		putchar(ch);
	}
	return 0;
}

这串代码在运行后,如果输入一个字符再按下回车,本因在第二行的光标跳到了第三行,这就很让人疑惑了,为什么呢?

我们按了键盘上的a和回车,这时a\n就被传入了缓冲区,而getchar与putchar一次只能获取一个字符,它先将a获取并打印了出来,此时缓冲区还有\n,由于\n并不是EOF,再经历一次循环,把\n也打印出来了,于是光标从第二行跳到了第三行。

实例二

我们来用代码模拟实现一下输入密码

#include <stdio.h>
int main()
{
	char password[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s", password);
	printf("请确认密码(Y/N)\n");
	int ret = getchar();
	if ('Y' == ret)
		printf("Yes\n");
	else
		printf("NO\n");
	return 0;

}

我们运行一下这个代码 

 我们输入密码后,还没有确认就直接输出NO了,这是为什么呢?

在我们输入password后会按回车将字符输进计算机中,这时abc123\n就会传入缓冲区,而scanf从缓冲区中只读取abc123缓冲区会剩下\n被后面的getchar读取,就导致直接输出了NO 

现在我们来改进一下代码

#include <stdio.h>
int main()
{
	char password[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s", password);
	while (getchar() != '\n');\\将除了password之外多余的字符获取除掉
	printf("请确认密码(Y/N)\n");
	int ret = getchar();
	if ('Y' == ret)
		printf("Yes\n");
	else
		printf("NO\n");
	return 0;
}

 加了while循环后,getchar便可获取缓冲区中多余的字符,避免他们干扰后面的getchar的判断。

这里有一个巧妙的地方,由于循环的判断次数总比循环次数多一次,使得getchar在最后也能将'\n'获取除掉。

总结

getchar与scanf不是直接从键盘上获取数据,而是通过中间缓冲区来获取。

 

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨染萧然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值