创建一个数字猜测游戏C

创建一个数字猜测游戏C,c,numbers,comparison,C,Numbers,Comparison,我正在尝试用C语言做一个数字猜测游戏,在这个游戏中,计算机选择一个数字,你必须猜它是哪个数字。如果您选择的数字大于要猜测的数字,则该值太高,反之亦然。然而,在我的实现中,无论你猜到什么数字,它都是不正确的。如果您能告诉我下面的代码有什么问题,我将不胜感激 #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void){ srand(time(NULL)); char i

我正在尝试用C语言做一个数字猜测游戏,在这个游戏中,计算机选择一个数字,你必须猜它是哪个数字。如果您选择的数字大于要猜测的数字,则该值太高,反之亦然。然而,在我的实现中,无论你猜到什么数字,它都是不正确的。如果您能告诉我下面的代码有什么问题,我将不胜感激

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void){
   srand(time(NULL));
   char instring[1];
   int inint;
   int guess;
   guess=rand();
   while (guess!=inint){
      printf("Guess Number\r\n");
      gets(instring);
      inint=atoi(instring);
      if(inint>guess){
         puts("too high");
      }else if(guess>inint){
         puts("too low");
      }else{
         puts("right");
      }
   }
   return 0;
}
#包括
#包括
#包括
内部主(空){
srand(时间(空));
字符指令[1];
内部;
智力猜测;
猜测=兰德();
while(猜!=inint){
printf(“猜测数字\r\n”);
获取(指令);
inint=atoi(仪表);
如果(inint>猜测){
卖出(“太高”);
}否则如果(猜测>输入){
看跌期权(“太低”);
}否则{
看跌期权(“对”);
}
}
返回0;
}

char instring[1]C字符串需要一些字符的空间+一个额外的空间用于终止0。您的字符串的长度为1,因此只能容纳终止的0。尝试将其大小增加到32

另外,
inint
在使用之前是不会初始化的(这很糟糕)-因为运气好,
inint
may
==guess
甚至在用户猜测之前

也看到

你可以做:

char buffer[32]
fgets(buffer, sizeof(buffer), stdin);

作为一种安全的方式,只需进行最小的更改,或者您可以查看
scanf()
。两者都比
获取更安全

您的代码中有很多不清楚的地方,请先弄清楚。例如
inint
不是第一次初始化的。另外,为什么
指令
大小仅为
1字节
。如果您输入了
min1char
,您还需要
2字节
,加上一个用于终止
\0
字符。因此,增加
指令的大小

int main(void){
        srand(time(NULL));
        char instring[32];/* increase the size */
        int inint = 0;/* u forget to initialize */
        int guess=rand();
        while (guess!=inint){ /* when this condition fails ? */
                printf("Guess Number\r\n");
                //gets(instring);/* don't use gets(), instead use fgets() */
                fgets(instring,sizeof(instring),stdin);
                inint = atoi(instring);
                if(inint > guess){
                        puts("too high");
                }else if(guess>inint){
                        puts("too low");
                }else{
                        puts("right");
                }
        }
        return 0;
}

同时阅读
man 2 rand()
&检查它返回的内容。最后使用
fgets()
而不是
gets()
我使用
scanf
实现了这一点;我不喜欢必须分配一个使用
char
数组来保存字符串,然后必须使用
atoi
来转换为整数

请注意,当我初始化
rand()
时,括号后面的值是最大值(减1)。我不想要零,所以我在数字上加了一,这样我们的玩家就能猜到1到10

#include <stdio.h>
#include <stdlib.h>


int main(void) {
    srand(time(NULL));

    int inint = 0;
    int guess = rand() % 10 + 1;

    while (guess != inint) {
        scanf(" %d", &inint);

        if(inint > guess){
            puts("too high");
        } else if (guess>inint){
            puts("too low");
        } else{
            puts("right");
        }
    }

    return 0;
}
#包括
#包括
内部主(空){
srand(时间(空));
int-int=0;
int guess=rand()%10+1;
while(猜!=inint){
scanf(“%d”、&inint);
如果(inint>猜测){
卖出(“太高”);
}否则如果(猜测>输入){
看跌期权(“太低”);
}否则{
看跌期权(“对”);
}
}
返回0;
}
一如既往,如果你有任何问题,请告诉我



关于输入缓冲区中的新行,今天又出现了一个关于
scanf
和格式说明符前的空格的问题,因此我将只回答。

您正确的猜测在
while(guess!=init)
中。
这就是为什么你总是会有不正确的猜测。

你所说的
不正确是什么意思。
<代码>inint
未第一次初始化。还有为什么
instring
大小仅为
1
字节。如果您输入了
min1 char
,您还需要
2
字节,加上一个用于终止
\0
char。每次获得
指令时,指令中可能存在内存溢出。它肯定会通过覆盖内存中的字节来改变
guess
值,你猜不到它,因为它会改变每个循环!关于:
get(instring)
函数:
gets()
已折旧多年,在最新的C标准中已完全删除。强烈建议使用:
fgets()
,其语法为:
char*fgets(char*s,int size,FILE*stream)关于:
获取(指令);inint=atoi(仪表)
整数字符串的长度(最多)为17字节,但
instring
的长度只有一个字节。因此,在所有情况下,数组:
instring[]
都处于溢出状态。结果是未定义的行为。您的代码存在很多问题。:'(你需要修正它们。你正确地认识到,将instring的长度增加到32,这对于这个目的来说已经足够了。实际发生的事情是这样的(instring)在instring中写入,当instring中的空间用完时,它开始在guess中写入。这意味着guess的值在循环的每次迭代中都会发生变化。这意味着用户必须猜测一个不断变化的数字,这是不可能的。另外,如何防止用户键入长度大于32的字符串?@Red.Yep.这是一个“标准缓冲区溢出”,它将清除某些内容并给出未定义的行为。您可以将
fgets
stdin一起使用,或者查看
scanf()
-请参阅编辑谢谢,但这个问题比这个问题更深。无论我使用fgets还是scanf,用户都可能键入过大的数字,导致inint溢出并变为负数。然后,我的代码将打印“过低”即使用户键入的数字大于猜测的数字。我如何继续解决这个新发现的问题?@Red确定您没有过度思考?为什么不将输入读取为字符串,然后
if(strlen(instring)>4)printf(“最大数字为9999\n”)
我认为您所做的是正确的,但是在您的实现中guess may初始化为0,循环将在一次迭代之前结束。这意味着用户永远无法猜测数字。另一件需要注意的事情是,如果用户键入的数字太大,inint将溢出并变为负数。然后,您的代码将打印“太低”即使用户键入的数字大于猜测的数字。我如何继续解决这些问题?循环将在一次迭代之前结束?是的,可能bcz
rand()