(C)添加整数的麻烦

时间:2014-10-22 02:09:50

标签: c

我在使用简单的加法计算器时遇到了麻烦。

我输入第一个号码后,程序崩溃了。

#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);
}

2 个答案:

答案 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。你必须传递变量的地址。