我正在尝试在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;
}
答案 0 :(得分:1)
char instring[1];
AC字符串需要空格用于某些字符+一个额外空格用于终止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
答案 1 :(得分:0)
你的代码中有很多不清楚的东西,首先要说清楚。类似inint
没有第一次初始化。另外,为什么instring
尺寸仅为1 byte
。如果您输入min 1 char
,则还需要2 byte
,另外还需要一个用于终止\0
字符。因此,请增加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()
&amp;检查它返回的内容。最后使用fgets()
代替gets()
。
答案 2 :(得分: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。
答案 3 :(得分:0)
您的正确猜测位于while (guess != init)
内部。
这就是您总是会有错误猜测的原因。