c语言 for循环中嵌套switch语句循环次数问题

问题

switch(n)中的n在n为int型和char型,在for循环中循环次数不同

代码及结果

(1)n为字符型:

int main()
{
    char n;
    int i;
    for(i=0;i<2;i++){
        scanf("%c",&n);
        switch(n){
            case '0': printf("1\n");break;
            case '1': printf("2\n");break;
            case '2': printf("3\n");break;
            case '3': printf("4\n");break;
            case '4': printf("5\n");break;
        }
    }
}

运行结果:输入一个数字,程序执行一次循环就会结束;
(2)n为int型:

int main()
{
    int n;
    int i;
    for(i=0;i<2;i++){
        scanf("%d",&n);
        switch(n){
            case 0: printf("1\n");break;
            case 1: printf("2\n");break;
            case 2: printf("3\n");break;
            case 3: printf("4\n");break;
            case 4: printf("5\n");break;
        }
    }
}

运行结果:可以按照for循环输入两个数字后程序结束

想问下这是什么原因导致循环次数不一样



输入第一个字符后按下回车
接下来scanf("%c",&n)会读取回车符,在后面加一句getchar()就行了

#include <stdio.h>
#include <malloc.h>
int main()
{
    char n;
    int i;
    for(i=0;i<2;i++){
        scanf("%c",&n);
        getchar();
        switch(n){
            case '0': printf("1\n");break;
            case '1': printf("2\n");break;
            case '2': printf("3\n");break;
            case '3': printf("4\n");break;
            case '4': printf("5\n");break;
        }
    }
}
 

当n是字符型时,输入字符以后,还会多输入一个回车符,回车符被作为下一次scanf接收了。所以看起来只循环了1次。
但是当n是int类型时,回车符被忽略,所以能正常输入2次

字符类型改成这样就好了,加一个getchar()吸收缓存,不然上次输入完成后的enter会被当做字符

int main()
{
    char n;
    int i;
    for(i=0;i<2;i++){
        scanf("%c",&n);
        getchar();
        switch(n){
            case '0': printf("1\n");break;
            case '1': printf("2\n");break;
            case '2': printf("3\n");break;
            case '3': printf("4\n");break;
            case '4': printf("5\n");break;
        }
    }
}