#include <stdio.h>
int main () {
int vIn_a, vIn_b, vIn_c;
char vOperator;
printf("Please enter a numbern");
scanf("%d", vIn_a);
printf("Please enter a numbern");
scanf("%d", vIn_b);
printf("Please enter a Operatorn");
scanf("%c", vOperator);
switch(vOperator){
case '+':
vIn_c = (vIn_a + vIn_b);
break;
case '-':
vIn_c = (vIn_a - vIn_b);
break;
case '/':
vIn_c = (vIn_a / vIn_b);
break;
case '*':
vIn_c = (vIn_a * vIn_b);
break;
}
printf("Result: %d %c %d = %d", vIn_a, vOperator, vIn_b, vIn_c);
return 0;
}
只是想弄清楚,我运行了gdb。但不确定我的调试器在这一点上告诉我什么。也许我忽略了它?调试器:程序收到信号SIGSEGV,分段错误。0x00007ffff7c60d36 in ??(1) from/usr/lib/lib .so.6
那么是什么导致了这种分割错误呢?我在学C,我迷路了。
提前感谢。
当您使用scanf()
时,您不传递要存储值的变量,而是传递指针到变量。
因此,例如,您需要的不是scanf("%d", vIn_a);
,而是scanf("%d", &vIn_a);
-注意'&
'!
scanf()
调用的效果,正如您所写的,是将一个任意数字(无论未初始化的vIn_a
和vIn_b
中的随机内容是什么)传递给scanf()
。它把那些随机的整数值当作指针。所以当它将用户贡献的值写入指针时;它被通过了,它的效果是:
*(int *)vIn_a = user_entered_value;
如果你知道指针的用法,你就会知道这是一个灾难的配方!
还有两个陷阱:
-
您的'
/
'操作符不检查其除数(vIn_b
)是否为零,因此如果用户为vIn_b
选择零并为操作符选择'/
',则很容易崩溃。 -
在你的
switch
语句中没有default:
子句,所以如果用户键入的不是你正在检查的操作符字符,vIn_c
将包含随机垃圾,因为它在打印时未初始化。
可以使用&例如;scanf("%d", &vIn_a);
文档:https://cplusplus.com/reference/cstdio/scanf/