getchar()和scanf()输入遗留一个’\n’的问题。
当程序需要多次从控制台键盘输入获取一个字符或者字符串时,第二次获取程序会自动获取一个'\n',导致不能正常获取需要的数据。
例子如下:
#include<stdio.h>
int main(void)
{
char ch1,ch2;
printf("input the first code: ");
scanf("%c",&ch1);
printf("input the second code: ");
scanf("%c",&ch2);
printf("they are %c,%c",ch1,ch2);
return 0;
}
程序执行结果:
执行过程:
1.先走到第一条提示打印,然后卡在scanf这里等着从键盘获取一个字符;
2.输入数据1和回车,也就是 ’ 1 ’ 和 ’ \n ';
3.打印第二条提示,不会卡在第二个scanf这里等着输入,直接默认输入的是空;
4.打印两个字符里面存储的东西,ch1是 ’ 1 ’ ,ch2是 ’ \n ';
我预想的结果是输入1,然后再输入2,然后这两个字符里面装的就该是1和2;但是第二个scanf输入时并没有让我输入,直接默认往里面存入 ’ \n ’ 了。
这是因为我们输入进去之后,数据是存在一个buffer里面的,若有需要(比如这里的把他存在ch1里面),就会去这个buffer里面读取数据,第一次输入其实是两个字符,’ 1 ’ 和 ’ \n ',第一次存入ch1时将 ’ 1 ’ 存进去了,但是 ’ \n ’ 还在这个buffer里面。第二次再去读取这个buffer的时候,就直接读取到 ’ \n ’ ,所以ch2里面装的是 ’ \n '。
解决这个问题的方法很简单,既然问题的原因是因为在buffer里面还剩下一个 ’ \n ’ 没被读取,那么只需要每次读取之后,把这个 ’ \n ’ 清除就可以了。(好像是有专门的清除这个buffer的函数,但是这里我用不着,若有需要再补上)
示例
#include<stdio.h>
int main(void)
{
char ch1,ch2;
printf("input the first code: ");
scanf("%c",&ch1);
printf("input the second code: ");
while(getchar()!='\n');
scanf("%c",&ch2);
printf("they are %c,%c",ch1,ch2);
return 0;
}
只需要在第二次之前,加一句while(getchar()!=’\n’);
原理就是用getchar()函数把buffer里面的剩余的 ’ \n ’ 读取掉,清空这个buffer。
结果:
只需要在第二次之前,加一句while(getchar()!=’\n’);
原理就是用getchar()函数把buffer里面的剩余的 ’ \n ’ 读取掉,清空这个buffer;
这个问题应该只有小白才会遇到,一般实际中不会使用scanf或者getchar输入。