我在使用简单的加法计算器时遇到了麻烦。
我输入第一个号码后,程序崩溃了。
#include <stdio.h>
int main()
{
printf("Addition calculator\n");
int num1,num2;
printf("Enter the first number: ");
scanf(" %d",num1);
printf("\nEnter the second number: ");
scanf(" %d",num2);
int sol;
sol=num1+num2;
printf("The solution is %d", sol);
return(0);
}
答案 0 :(得分:4)
scanf(" %d", &num1);
scanf
期望变量的地址,因此它可以更改其值。您将num1
的值作为地址传递,该地址具有非常非常的概率,可能是您的程序不允许写入的地方。
num2
相同。
我喜欢类比,所以......
想想这段代码:
int recordASeven(int x) {
x = 7;
}
int main() {
int y = 0;
recordASeven(y);
printf("y is %d\n", y);
}
这会打印0
。为什么?就像这样:你的储物柜里有一张纸,上面写着“0”。你将“0”小心地复制到另一张纸上,交给朋友说“在这里写下7”。他这样做了,然后扔掉了纸。你看看你的储物柜,你自己的纸上写着“0”。因为你传递了你的朋友的纸张而不是你自己的纸张,他不能改变你自己的原件。与C中的函数相同 - 它们不能更改它们传入的变量。因此scanf
不能直接修改变量。
int recordASevenBetter(int *x) {
*x = 7;
}
int main() {
int y = 0;
recordASeven(&y);
printf("y is %d\n", y);
}
现在,你拿一张白纸,给他打开储物柜的组合,然后把那个给你的朋友,说:“去我的储物柜,在纸上写下7在那里”。当你去检查你的储物柜里的纸张时,果然,它上面有“7”。在C语言中,“&amp; y”将为您提供y
的值所在的位置(“指针”),以便任何可以改变它的位置; “* x”将访问由x
的值指定的位置中的值。
int recordASevenAndFailMiserably(int *x) {
*x = 7;
}
int main() {
int y = 0;
recordASeven(y);
printf("y is %d\n", y);
}
最后,这是你的问题:你给你的朋友一份你的“0”,并告诉他这是你的储物柜组合。当他打开你的储物柜时,他会感到沮丧,摧毁你的房间并在地板上撒尿。
在这种情况下,编译器可以检测到差异,因为声明的类型与提供的类型之间存在明显的不匹配,编译器将拒绝执行此操作。但是scanf
使用可变参数列表,这意味着声明不会列出参数类型。 scanf
负责对格式进行decypher并将其得到的字节包解释为合理的。编辑器只能袖手旁观(当你启用警告时),因为你撒谎到scanf
关于你给它的东西。
答案 1 :(得分:0)
如Amandan所述,请将其更改为&amp; num1和&amp; num2。你必须传递变量的地址。