Scanf 没有扫描 %c 字符而是跳过语句,这是为什么?

Scanf is not scanning %c character but skips the statement, why is that?

我使用 switch case 语句编写了一个程序并要求输入一个字符,但它不要求在控制台中输入该字符 window 而是完全跳过它

int main() 
{
    float a, b, ans;
    char opr;

    printf("\nGIVE THE VALUES OF THE TWO NUMBERS\n");
    scanf(" %f %f",&a,&b);


    printf("\nGIVE THE REQUIRED OPERATOR\n");   

    //no display(echo) on the screen
    //opr = getch();
    //displays on the screen
    //opr = getche();

    scanf("%c",&opr);

    switch(opr)
    {
        case '+' :
            ans = a+b;
            printf("%f", ans);
            break;          
        case '-' :
            ans = a-b;
            printf("%f", ans);
            break;          
        case '*' :
            ans = a*b;
            printf("%f", ans);
            break;          
        case '/' :
            ans = a/b;
            printf("%f", ans);
            break;
        case '%' :
            ans = (int)a % (int)b;
            printf("%f", ans);
            break;
        default :
            printf("\nGIVE A VALID OPRATOR\n");

    }

    system("pause");        
    return 0;

但是当我在第二个 %c 之前放一个 space 时 scanf 它起作用了,有人在讲述一个白色的东西 space 我觉得很困惑

他说第二个 scanf\n 的值作为一个字符,如果我在第二个 %c 之前放一个 space scanf那不是一个字符,它不是以space作为字符吗?

但是在这个程序中并没有把\n作为字符

int main() 
{
    char a;
    printf("\ngive a char\n");
    scanf("%c",&a);
    printf("%c",a);

    return 0;
}  

这真的很令人困惑,任何人都可以帮助我,我想知道哪里出了问题。

第二个程序确实以\n为字符。
可能你在输入其他字符之前根本没有输入\n

example ( %c in printf is changed to %d to make it clear)

问题是您在未使用数字之后输入的 \n 被第二个 scanf() 读取。 如果您检查 opr 中的值,您会看到它是 '\n'。

每次使用这种格式的 scanf 时:

scanf("%c",&a); 

它留下一个换行符,将在下一次迭代中使用。 您提到的最后一个程序只有一个 "scanf"。尝试使用另一个 scanf。你会遇到同样的问题。

所以为了避免白色 spaces 你必须写:

 scanf(" %c",&opr); 

格式字符串前的 space 告诉 scanf 忽略白色 spaces。或者最好使用

getchar();

它将消耗你所有的换行符

尝试在 scanf 之前添加 fflush(stdin)。