今天写代码的时候发现了一个错误,一时半会想不明白为什么错了
我们来看下面两个代码
#include<stdio.h>
int main()
{
char eng = 0;
while (scanf("%c", &eng) != EOF)
{
if (eng == 'A' || eng == 'E' || eng == 'I' || eng == 'O' || eng == 'U' || eng == 'a' || eng == 'e' || eng == 'i' || eng == 'o' || eng == 'u')
{
printf("Vowel\n");
}
else
{
printf("Consonant\n");
}
}
return 0;
}
输入a的时候,会输出Vowel和Consonant,经过调试发现,while循环循环了两次
我们的目标输出是Vowel,我想到之前学的,scanf会将缓冲区的\n进行读取,所以需要用一个方式来清理掉缓冲区里面的\n
得到这段代码
getchar用来接收一个字符,可以将缓冲区的\n,接收掉
#include<stdio.h>
int main()
{
char eng = 0;
while (scanf("%c", &eng) != EOF)
{
if (eng == 'A' || eng == 'E' || eng == 'I' || eng == 'O' || eng == 'U' || eng == 'a' || eng == 'e' || eng == 'i' || eng == 'o' || eng == 'u')
{
printf("Vowel\n");
getchar();
}
else
{
printf("Consonant\n");
getchar();
}
}
return 0;
}
这个时候输出的结果就是Vowel了
但是我之后看到了这段代码,当输入1,为什么他没有添加getchar也不会循环两次,输出Odd,Odd呢?
#include<stdio.h>
int main()
{
long n = 0;
while (scanf("%d", &n) != EOF)
{
if (n % 2 == 0)
printf("Even\n");
else
printf("Odd\n");
}
return 0;
}
经过后面的思考,我发现,下面的scanf接收的是%d,所以不会读取到缓冲区内的\n
而上面scanf接收的是%c,所以会接收缓冲区内的\n(只有当scanf接收的是%c的时候,才会接收缓冲区内的\n)