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

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

我使用 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;

但是当我在 %c 前面加一个空格时在第二个scanf有人在讲述一些关于空白的事情,我发现这很令人困惑

他说第二个scanf取值 \n作为一个字符,如果我在 %c 之前加一个空格在第二个scanf那不是一个字符而且不是以空格为字符吗?

但是在这个程序中它并没有采用 \n作为角色

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

    return 0;
}  

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

最佳答案

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

scanf("%c",&a); 

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

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

 scanf(" %c",&opr); 

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

getchar();

它将消耗你所有的换行符

关于c - scanf 不扫描 %c 字符而是跳过该语句,这是为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32643397/

相关文章:

node.js - JS/node.js : Large switch-case blocks vs. 函数集合

java - 组织命令行界面命令的好方法是什么?

位串的字符数组

c - c中是否有一个函数可以返回char数组中char的索引?

c - 使用地址在 gdb 中打印结构类型的值

c - Left Shift 和 Right Shift 防止除法丢失

c++ - 从 Char 数组中删除前两个字符

java - 开始 Java 决策结构和数学对象 Switch 语句

c - 修改 char *array[x][y]

c - 从文件制作链接列表有什么问题