创建一个数字猜测游戏C
我正在尝试用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
#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将溢出并变为负数。然后,您的代码将打印“太低”即使用户键入的数字大于猜测的数字。我如何继续解决这些问题?循环将在一次迭代之前结束?是的,可能bczrand()