[英]Creating a number guessing game C
我試圖用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];
AC字符串需要一些字符的空間+一個以0結尾的空格。您的字符串長度為1,因此只能容納0終止字符。請嘗試將其大小設置為32。
另外,在使用inint
之前,它永遠不會初始化(這很糟糕)-運氣不好, inint
可能== guess
在用戶== guess
之前就進行了猜測。
您可以這樣做:
char buffer[32]
fgets(buffer, sizeof(buffer), stdin);
作為一種安全的方法,只需很少的更改,或者您可以查看一下scanf()
。 兩者都比gets
更安全
您的代碼中有很多不清楚的地方,首先要弄清楚。 inint
第一次沒有初始化。 也是為什么instring
大小只有1 byte
。 如果您輸入的是min 1 char
還需要2 byte
,外加1個用於終止\\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()
並檢查返回的內容。 最后使用fgets()
代替gets()
。
我使用scanf
實現了這一點; 我不喜歡必須分配一個使用char
數組來保存字符串,然后不必使用atoi
轉換為整數。
請注意,當我初始化rand()
,括號后的值是最大值(減一)。 我不希望為零,所以我在數字上加了一個,以便我們的玩家猜在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
和格式說明符前的空格,今天再次有一個關於輸入緩沖區中的新行的問題,因此我將其留在這里 。
您的正確猜測是在while (guess != init)
內部while (guess != init)
。 這就是您總是會有不正確的猜測的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.