当交换scanf()调用时,C程序不能完全执行

时间:2014-10-31 22:37:11

标签: c scanf

此程序不允许我输入操作并直接进入开关中的默认大小写,打印"Error!!"

printf("Enter two integers: \n");
scanf("%d%d",&a,&b);
system("cls");
printf("Enter an operation :  ");
scanf("%c",&op);

switch(op)
{
    case '+': printf("%d+%d=%d\n",a,b,a+b); break;
    case '*': printf("%d*%d=%d\n",a,b,a*b); break;
    case '-': printf("%d-%d=%d\n",a,b,a-b); break;
    case '/': printf("%d/%d=%d\n",a,b,a/b); break;
    default: printf("Error!! \a \n");
}
return 0;

但是,当我在下面的“输入两个整数”之前输入“输入操作”的printf语句时,程序运行顺利。有没有人知道第一个程序会出现什么问题?

printf("Enter an operation :  ");
scanf("%c",&op);
printf("Enter two integers: \n");
scanf("%d%d",&a,&b);
system("cls");


switch(op)
{
    case '+': printf("%d+%d=%d\n",a,b,a+b); break;
    case '*': printf("%d*%d=%d\n",a,b,a*b); break;
    case '-': printf("%d-%d=%d\n",a,b,a-b); break;
    case '/': printf("%d/%d=%d\n",a,b,a/b); break;
    default: printf("Error!! \a \n");
}
return 0;

2 个答案:

答案 0 :(得分:2)

如果添加

printf("%d\n", op)

在第一个版本的scanf("%c", &op);之后,您会看到op的值为10或14.这是\n(换行符)或\r (回车)。

explanation for that behaviour是:

  

指定 c 时,会读取通常跳过的空白字符。

要在第二个数字后忽略CR / NL,请将scanf("%c", &op);更改为

scanf(" %c", &op);

答案 1 :(得分:0)

考虑这行代码:

scanf("%d%d", &a, &b);

如果编译并运行以下代码:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv) {
    int a, b;

    scanf("%d%d", &a, &b);
    printf("a:%d b:%d\n", a, b);

    return EXIT_SUCCESS;
}

我们如何将a设置为1,将b设置为2?如果我输入12,那么12的{​​{1}}和a的{​​{1}}。我认为你缺少两个格式说明符之间的空格。