目录
前言
想必大家在初学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不是直接从键盘上获取数据,而是通过中间缓冲区来获取。