创建数字猜谜游戏C.

问题描述 投票:0回答:4

我试图在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;
}
c numbers comparison
4个回答
1
投票

char instring[1]; C字符串需要一些字符的空间+一个额外的空格用于终止0.您的字符串长度为1,因此它只能适应终止0.尝试增加它的大小为32。

inint在你使用它之前永远不会被初始化(这很糟糕) - 在用户甚至猜测之前,运气inint可能会== guess

另见Why is the gets function so dangerous that it should not be used?

你可以这样做:

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

作为一种最小变化的更安全的方式,或者你可以看看scanf()。两者都比gets更安全


0
投票

你的代码中有很多不清楚的东西,首先说清楚。像inint第一次没有初始化。也为什么instring大小只有1 byte。如果你输入min 1 char,你需要2 byte,加上一个用于终止\0 char。所以增加instring的大小。

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()


0
投票

我使用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;
}

一如既往,如果您有任何疑问,请与我联系。


关于scanf和格式说明符之前的空格,今天在输入缓冲区中有一个关于新行的问题,所以我只是leave this here


0
投票

你正确的猜测是在while (guess != init)内。这就是你总是猜错的原因。

© www.soinside.com 2019 - 2024. All rights reserved.