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

psr*_*esh 2 c scanf char dev-c++ switch-statement

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

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;
Run Code Online (Sandbox Code Playgroud)

但是当我%c在第二个之前放置一个空格时,scanf它起作用了,有人在谈论我发现令人困惑的空格

他说第二个scanf是取值\n作为字符,如果我%c在第二个之前放一个空格scanf不是一个字符,它不把空格作为字符吗?

但是在这个程序中它不以 the\n作为字符

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

    return 0;
}  
Run Code Online (Sandbox Code Playgroud)

这真的很令人困惑,任何人都可以帮助我,我想了解出了什么问题。

sec*_*nes 5

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

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

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

所以为了避免空格,你必须写:

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

格式字符串前的空格告诉 scanf 忽略空格。或者它更好地使用

getchar();
Run Code Online (Sandbox Code Playgroud)

它会消耗你所有的换行符