C 开关小程序不允许我输入选项

C 开关小程序不允许我输入选项,c,switch-statement,C,Switch Statement,我在学习C,我在练习切换,我运行程序,但不允许我输入*,+,-,这是我的代码。我可以输入第一个和第二个数字,但不能输入操作员,在我输入数字后,程序完成。不知道为什么。多谢各位 #include <stdio.h> int main(int argc, char *argv[]) { int num1, num2, ans=0; char ch, name; printf("Enter a value: "); scanf("%d",&num1); printf("Ent

我在学习C,我在练习切换,我运行程序,但不允许我输入*,+,-,这是我的代码。我可以输入第一个和第二个数字,但不能输入操作员,在我输入数字后,程序完成。不知道为什么。多谢各位

#include <stdio.h>

int main(int argc, char *argv[])
{
int num1, num2, ans=0;
char ch, name;

printf("Enter a value: ");
scanf("%d",&num1);

printf("Enter a second value: ");
scanf("%d",&num2);

printf("Input * To multiply\
              + To add\
              - To subtract");
scanf("%c",&ch);

switch(ch)
{
case'*':
    ans=num1 * num2;
    printf("%d times %i equals: %i",num1,num2,ans);
    break;

case'+':
    ans=num1+num2;
    printf("%i plus %i equals: %d",num1,num2,ans);
    break;

case'-':
    ans=num1-num2;
    printf("%d minus %d equals: %d",num1,num2,ans);
    break;

default:
    printf("Range numbers");
}
return 0;
}
#包括
int main(int argc,char*argv[])
{
int num1,num2,ans=0;
char-ch,name;
printf(“输入值:”);
scanf(“%d”&num1);
printf(“输入第二个值:”);
scanf(“%d”&num2);
printf(“输入*进行乘法运算\
+加\
-减去“);
scanf(“%c”和“ch”);
开关(ch)
{
案例“*”:
ans=num1*num2;
printf(“%d乘以%i等于:%i”,num1,num2,ans);
打破
格“+”:
ans=num1+num2;
printf(“%i加上%i等于:%d”,num1,num2,ans);
打破
案例'-':
ans=num1-num2;
printf(“%d减去%d等于:%d”,num1,num2,ans);
打破
违约:
printf(“范围编号”);
}
返回0;
}
这是:

scanf("%c",&ch);
正在从
num2
的条目中读取换行符:在读取
ch
之前需要跳过它

改为:

scanf(" %c", &ch);
%c
之前添加空格将指示
scanf
跳过换行符和空格。

这是:

正在从
num2
的条目中读取换行符:在读取
ch
之前需要跳过它

改为:

scanf(" %c", &ch);

%c
之前添加空格将指示
scanf
跳过换行和空白。

这是因为您使用的
scanf(“%d”)
不是面向行的函数。它只读取数字,但在缓冲区中保留换行符,然后由
scanf(“%c”)
调用读取

由于您希望进行基于行的输入,因此可能需要使用
fgets
atoi
来获得更明确和一致的行为。
fgets
函数始终精确读取一行。例如,像这样:

char buf[1024];

printf("Enter a value: ");
fgets(buf, sizeof(buf), stdin);
num1 = atoi(buf);

/* ... */

printf("Enter operator: ");
fgets(buf, sizeof(buf), stdin);
ch = buf[0];

这是因为您使用的
scanf(“%d”)
不是面向行的函数。它只读取数字,但在缓冲区中保留换行符,然后由
scanf(“%c”)
调用读取

由于您希望进行基于行的输入,因此可能需要使用
fgets
atoi
来获得更明确和一致的行为。
fgets
函数始终精确读取一行。例如,像这样:

char buf[1024];

printf("Enter a value: ");
fgets(buf, sizeof(buf), stdin);
num1 = atoi(buf);

/* ... */

printf("Enter operator: ");
fgets(buf, sizeof(buf), stdin);
ch = buf[0];