我试图在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;
}
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
更安全
你的代码中有很多不清楚的东西,首先说清楚。像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()
。
我使用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。
你正确的猜测是在while (guess != init)
内。这就是你总是猜错的原因。