有人可以解释这个输出吗?

nj-*_*ath 0 c scanf undefined-behavior

当我遇到这个时,我正在经历一些程序.

#include<stdio.h>
void main()
{
char z;
do
{
    printf("1st line\n");
    printf("2nd line\n");
            scanf("%c",&z);

    switch(z)
    {
        case 'a':printf("this is case a\n");
            break;
        case 'b':printf("this is case b\n");
            break;
        case 'c':printf("Exit\n");
            return;
            break;
        default:
            printf("this is default\n");
            break;
    }
}while(1);
Run Code Online (Sandbox Code Playgroud)

}

我第一次给出输入,输出是正确的.但是在给出第一个输入并且第二次开始循环之后,根本不执行scanf语句.printf语句虽然执行,但也是默认情况.

第1行
第2行
b
这是情况b
第1行
第2行
这是默认
第1行
第2行

jxh*_*jxh 6

当您输入b第一个scanf电话时,您也按.当scanf("%c", &z)处理该输入,它留下的输入流中的换行字符.

第二组输出是由于scanf读取了后面的换行符b.因为\n它既不是a,也不是b,也不c是默认情况.

您可以通过修改scanf字符串来修复行为,使其更符合您的期望:

scanf(" %c", &z);
Run Code Online (Sandbox Code Playgroud)

注意之前的空格字符%c.这将导致scanf在处理输入之前跳过空白字符(包括换行符).