目录

前言

一、函数定义

二、函数读取数据的方式

三、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不是直接从键盘上获取数据,而是通过中间缓冲区来获取。