getchar介绍
getchar获取一个字符,读取成功返回字符的ASCLL码值,失败返回EOF。
清理缓冲区
我们看一道字母大小写转换的牛客题:BC48-字母大小写转换
#include<stdio.h>
int main()
{
char i;
while (scanf("%c",&i)!=EOF)
{
getchar();
if (i>= 'a' && i<= 'z')
{
i = i - 32;
printf("%c\n", i);
}
else if (i>= 'A'&&i<= 'Z')
{
i = i + 32;
printf("%c\n", i);
}
}
return 0;
}
这里的getchar就是清理缓冲区的作用,它是怎么做到的
其实scanf我们从键盘输入字符的时候,不是直接从键盘输入道scanf中,中间有一个缓冲区
scanf其实是从缓冲区中拿字符:
就像图片一样,如果我们输入 abcd 然后敲下回车,缓存区中就会有 abcd 回车键就会产生 '\n',scanf就拿走了abcd,留下了'\n'。
getchar就会把缓冲区剩下的 '\n' 拿走,这样缓冲区就被清零了,就可以进行下次输入了,如果我们没有清理缓冲区,下次 scanf 就会把上次剩下的'\n'先拿走,就不会是我们输入的字符了。
我们来看一个例子:输入一个密码,然后询问是否确认
#include<stdio.h>
int main()
{
char arr[10];
char a = 0;
printf("请输入密码:");
scanf("%s", arr);
//getchar();
printf("是否确认 y / n:");
scanf("%c", &a);
if (a == 'y')
{
printf("\n确认");
}
else
{
printf("\n不确认");
}
return 0;
}
如果我们没有getchar 结果:
我们都没有输入下一个字符就输出不确认了,说明缓冲区没被清理。只要加上就行了。
其实还有一个写法,scanf读取字符串的时候遇到空格就不再读取了:
像这样我们有getchar还是会直接输出不确认,为什么呢?因为scanf只拿走了abcd,空格之后还留下好多字符在缓冲区,一个getchar不够,所以我们需要这样写:
while (getchar() != '\n')
{
;
}
看结果:这样就成功了,我们用一个循环,getchar读取不到'\n'就一直读取直到读取到'\n'为止。
所以需要清空缓冲区的时候是要进行不止一次输入的时候,在一次scanf后面加上getchar清空缓冲区比较好。