我有以下代码。问题在于变量r
,它首先保存1-10之间的随机数。之后,它在循环内与用户输入数进行比较。当用户猜出随机生成的数字时,循环结束。
我使用short
类型作为猜测,int
作为随机生成的数字r
。关键是在用户第一次猜测后,r
变为0,我不知道为什么。如果guess
是int
,则不会发生此问题。
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(int argc, const char * argv[]) {
srand(time(NULL));
int r = (rand()%10)+1;
short guess = -1;
printf("%d\n", r);
while ((guess)!= r){
printf("%d\n", (int) guess);
printf("%d\n", guess);
printf("%d\n", r);
printf("Give me a number from 1 to 10: ");
scanf("%d",&guess);
if (guess> r){
printf("The number is lower\n");
}
else if (guess<r){
printf("The number is higher\n");
}
else {
printf("Corrent!\n");
}
}
return 0;
}
输出示例如下:
7
-1
-1
7
Give me a number from 1 to 10: 5
The number is lower
5
5
0
Give me a number from 1 to 10:
答案 0 :(得分:4)
问题在于:
scanf("%d",&guess);
变量guess
是short
,但%d
的{{1}}格式说明符需要指向scanf
的指针。使用错误的格式说明符int
或printf
会调用undefined behavior。
最有可能发生的事情是系统上的scanf
大于int
,导致在short
所在的内存中写入字节,覆盖附近的变量,在此情况1}}。但是,这种行为无法保证,并且可能会因看似无关的代码更改而发生变化。
使用正确的格式说明符:
guess
或者将r
的类型更改为scanf("%hd",&guess);
。由于没有真正的理由在这里使用guess
,我建议使用后者。