Scanf没有扫描%c字符但跳过语句,为什么会这样?

时间:2015-09-18 03:32:57

标签: c char switch-statement scanf dev-c++

我使用switch case语句编写了一个程序,并要求输入一个char但它不会在控制台窗口中询问char但是完全跳过它

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 scanf之前放置一个空格时,有人正在讲述一个我发现令人困惑的空白

他说第二个scanf\n的值作为一个字符,如果我在%c之前在第二个scanf中放置一个空格则不是\n一个角色,并没有把空间作为角色?

但是在这个程序中它不会将int main() { char a; printf("\ngive a char\n"); scanf("%c",&a); printf("%c",a); return 0; } 作为角色

<div id="image">
</div>

这真是令人困惑的任何人可以帮助我,我想知道什么是错的。

4 个答案:

答案 0 :(得分:3)

每次使用此格式的scanf时:

scanf("%c",&a); 

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

所以要避免使用白色空格:

 scanf(" %c",&opr); 

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

getchar();

它将消耗所有换行符

答案 1 :(得分:1)

第二个程序确实将gcc -fsanitize=address作为角色 也许你在输入其他字符之前根本没有输入\n

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

答案 2 :(得分:1)

问题是您在未使用的号码后离开\n,然后由第二个scanf()读取。 如果您检查opr中的值,则会看到它&#39; \ n&#39;

答案 3 :(得分:-2)

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