在 while 循环中使用 getchar(),打印一条语句两次......如何?

uni*_*kid 6 c

我有一个像这样的非常简单的程序

int main()
{
    int opt;
    int n;
    int flag = 1;
    while(flag)
    {
        printf("m inside while.Press c to continue\n");
        if((opt = getchar())== 'c')
        {
            printf("choose a number\n");
            scanf(" %d",&n);
            switch(n)
            {
            case 0:
                printf("m zero\n");
                break;
            case 1:
               printf("entered one\n");
               break;
            case 3:
               printf("m exit\n");
               flag = 0;
               break;
            }
            printf("m broke\n");
        }
    }
    printf("m out\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我得到这样的输出:

m inside while.Press c to continue
c
choose a number
1
entered one
m broke
m inside while.Press c to continue
m inside while.Press c to continue
c
choose a number
Run Code Online (Sandbox Code Playgroud)

我的疑问是为什么“m inside while.Press c to continue”在每次循环后都会打印两次?

提前致谢

hac*_*cks 5

这是因为\n前任留下的性格scanf。当您输入一个数字并按下Enter键时,一个额外的\n字符会被传递到标准输入缓冲区。scanf读取留\n在缓冲区中的那个 nuber 。在您按下任何字符之前,在循环的下一次迭代中getchar读取\n,因此m inside while.Press c to continue打印两次\nis not c
将此代码片段scanf放在while循环中的语句之后以吃掉换行符

while(getchar() != '\n');  
Run Code Online (Sandbox Code Playgroud)

这会吃掉任意数量的\n.
有关getchar阅读此答案的行为的更详细说明。
你最终的代码应该是

 int main()
{
    int opt;
    int n;
    int flag = 1;
    while(flag)
    {
        printf("m inside while.Press c to continue\n");
        if((opt = getchar())== 'c')
        {
            printf("choose a number\n");
            scanf(" %d",&n);
            while(getchar() != '\n');
            switch(n)
            {
            case 0:
                printf("m zero\n");
                break;
            case 1:
               printf("entered one\n");
               break;
            case 3:
               printf("m exit\n");
               flag = 0;
               break;
            }
            printf("m broke\n");
        }
    }
    printf("m out\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)


use*_*280 1

while(flag)
{
    printf("m inside while.Press c to continue\n");
    while((opt=getchar()) != '\n') {
    if(opt == 'c')
    {
        printf("choose a number\n");
        scanf(" %d",&n);
        switch(n)
        {
        case 0:
            printf("m zero\n");
            break;
        case 1:
           printf("entered one\n");
           break;
        case 3:
           printf("m exit\n");
           flag = 0;
           break;
        }
        printf("m broke\n");
    }
    }
}
Run Code Online (Sandbox Code Playgroud)