if (answer == 'Y') {
int a, u, l;
printf("How many numbers do you need?\n");
scanf("%d", a);
此行后该程序崩溃。我应该使用什么而不是“%d”?
printf("Specify the lower bound of the range:");
scanf("%d", l);
printf("Specify the upper bound of the range:");
scanf("%d", u);
for(c = 1;c <= a ;c++) {
n = rand() %(u - l) + 1;
printf("%d\n", n);
}
}
答案 0 :(得分:3)
scanf("%d", &a);
scanf()
需要一个可以存储信息的地址作为参数。
a
是变量的名称,而&a
是包含该变量的内存地址。
答案 1 :(得分:2)
您需要传递变量的地址,因为scanf()
会将值存储在其中。
程序崩溃是因为scanf()
正在取消引用int
,它甚至尚未初始化,这两种情况都会导致未定义的行为。
事实上,所有这些都是未定义的行为,并且都发生在单个scanf()
调用
要传递地址,请使用运算符的&
地址
if (scanf("%d", &a) == 1) {
// Proceed with `a' and use it
} else {
// Bad input, do not use `a'
}
在这种情况下,警告不是错误,因为int
原则上可转换为指针,但如果您尝试引用此类型,则行为未定义,并且指针大小可能太大int
存储它。
此警告非常严重,忽略它将永远不会导致良好的行为,因为它涉及处理一个不太可能像指针值一样的值,这通常会导致程序崩溃。
一般情况下,如果您真的知道自己在做什么,则应该忽略警告。而且几乎从来没有,你会故意做一些触发警告的事情,尽管有些事情可能是合法的。
作为初学者(我知道你是初学者只是因为你使用的是scanf()
),所以你不能忽视警告。
此外,即使您的教科书示例永远不会检查您应该scanf()
的返回值。不这样做,特别是当你没有初始化变量时,可能会调用未定义的行为。
答案 2 :(得分:0)
在scanf中传递变量的地址,如下所示:
if (answer == 'Y') {
int a, u, l;
printf("How many numbers do you need?\n");
scanf("%d", &a);
printf("Specify the lower bound of the range:");
scanf("%d", &l);
printf("Specify the upper bound of the range:");
scanf("%d", &u);
for(int c = 1;c <= a ;c++) {
n = rand() %(u - l) + l;
printf("%d\n", n);
}
}