c - 为什么变量在比较时会变成零?

标签 c random comparison

我有下面的代码。问题在于变量 r,它首先保存 1-10 之间的随机数。随后在循环内将其与用户输入的数字进行比较。当用户猜测随机生成的数字时,循环结束。

我使用 short 类型进行猜测,使用 int 类型进行随机生成的数字 r。关键是,在用户第一次猜测后,r 变成了 0,我不知道为什么。如果 guessint,则不会发生此问题。

#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: 

最佳答案

问题出在这里:

scanf("%d",&guess);

变量 guess 是一个 short,但 %d 格式说明符 scanf 期望一个指向一个int。使用错误的格式说明符来 printfscanf 调用 undefined behavior .

最有可能发生的情况是,您系统上的 int 大于 short,导致写入内存中的字节超过猜测 > 驻留,覆盖附近的变量,在本例中是 r。然而,这种行为并不能得到保证,并且可能会随着看似不相关的代码更改而改变。

使用正确的格式说明符:

scanf("%hd",&guess);

或者将guess的类型更改为int。由于没有真正的理由在这里使用 short,我建议使用后者。

关于c - 为什么变量在比较时会变成零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50819611/

相关文章:

c - 为什么使用 -Os 编译会使这个函数变大?

c++ - 将虚拟地址的逻辑地址转换为物理地址

c# - (U)Int64 和 Decimal 的(伪)随机约束值的生成

java,从多个数组中获取最高值

c - 如果在输入中找到小写字母,在使用C加密之前如何将其转换为大写?

c - 需要一些关于 C header 包含的建议

c - 用 C 生成随机数

python - 如何从一组图像中获取随机图像?

c# - 在 C#2.0 中比较字符串与字符串数组的最快方法

javascript - 如何检查变量是否不为空?