2014-10-29 79 views
-1

我對C/C++有點新鮮,而且我沒有看到我的問題在下面的代碼中。 在此作業中,我僅限於使用C函數和語法,不允許使用C++。C:rand()和scanf()故障?

該程序應該從字母表中選擇一個隨機字符,並給用戶3嘗試猜測它。

#include <stdio.h> 
#include <stdlib.h> 
#define guesses 3 

int main(){ 

    setbuf(stdout, NULL); 
    /* A 2.P.b */ 

    /* version with loop*/ 

    int i = 0; 
    char randomChar = (65 + (rand()%26) + 1); 

    /* comment the line below, when the programm works as intended */ 
    printf("\n%c\n", randomChar); 

    char guessedChar; 

    while((i<=guesses) && (guessedChar != randomChar)){ 

     printf("Guess a letter.\n"); 
     scanf("%c", &guessedChar); 

     if(guessedChar != randomChar){ 
      int guessesLeft = guesses - i; 
      if (guessesLeft > 1){ 
       printf("Wrong letter. You have %d more tries.\n", guessesLeft); 
      } 
      else{ 
       printf("Wrong letter. Last try."); 
      } 

     } 

     else{ 
      printf("Congratulations.\n"); 
     } 

     i++; 
    } 
    return 1; 
} 

輸出如下:

Q 
Guess a letter. 
A 
Wrong letter. You have 3 more tries. 
Guess a letter. 
Wrong letter. You have 2 more tries. 
Guess a letter. 
B 
Wrong letter. Last try.Guess a letter. 
Wrong letter. Last try. 

的問題:

所選擇的字母不是隨機的,但總是問:

的第一個猜測採用成本兩個「生活「?!

+1

兩個問題於一體。兩個重複。 http://stackoverflow.com/questions/8724582/rand-not-generating-random-numbers-after-modulo-operation http://stackoverflow.com/questions/3744776/simple-c-scanf-does-not-work – 2014-10-29 12:58:03

+3

您是否閱讀過[rand(3)](http://man7.org/linux/man-pages/man3/rand.3.html)&[scanf(3)](http ://man7.org/linux/man-pages/man3/scanf.3.html),你應該如何?如果你這樣做,你不會問這個問題。另外,試着瞭解RTFM和STFW的含義。並編譯所有警告和調試信息'gcc -Wall -Wextra -g')順便說一句,C和C++是*不同的語言* – 2014-10-29 12:59:43

+0

,也許GIYF和LMGTFY沿着同一條線略少進攻替代品。 – bph 2014-10-29 13:03:32

回答

1

scanf的問題在於,您輸入的字母后面的換行符仍然留在輸入緩衝區中,並且會在下一次讀取。

爲了解決這個問題簡單地告訴scanf閱讀並通過添加格式字符串中的一個空間跳過所有前導空格,如

scanf(" %c", &guessedChar); 
// ^
//  | 
//  Note space here 

與隨機數產生的問題是,你不」爲種子生成發生器,這意味着它始終始終以相同的種子開始,並始終生成相同的數字。

要設置你需要調用rand,其中非可預見的種子(當前的時間通常是足夠的)前致電srand功能種子:

srand(time(NULL)); 

然而有一個更嚴重的問題,那就是你在初始化之前使用了guessedChar。這將導致undefined behavior,因爲未初始化的非靜態局部變量具有不確定的值。您必須在使用它們之前初始化本地(非靜態)變量,並且唯一有效使用未初始化的變量是初始化它。

+0

非常感謝! :) – Alex 2014-10-29 13:13:41

1

也許,你總是得到Q,因爲你沒有給發生器播種。嘗試添加

srand (time(NULL)); 

生成它之前。

0

你需要在main隨機字母開始使用srand(不要忘了包括time.h!)

srand(time(NULL)); 

至於與scanf的問題,在scanf%c前添加一個空格:

scanf(" %c", &guessedChar); 

這樣做後,您刪除\n將出現在stdin輸入字符後按Enter鍵輸入字符。

0

當然。 rand()生成一個僞隨機數。對於像這樣的許多目的而言,這足夠隨意。但是,你必須改變出發點,否則你總會得到相同的數字。 你應該撥打電話srand(something);,對於某些東西,你可以用任何數字代替,這可以讓你有足夠的記憶知道「遊戲」,或者你可以用當前時間(包括毫秒)初始化,這將是非常不可能重複的。

#include <time.h>  /* time */ 

int main(){ 
srand (time(NULL)); 
... 
0

其實蘭特()是NT真正隨機的,因爲它從一個固定的數組被數,所以每次您呼叫蘭特(),你所得到的是相同的號碼,以便使用相同的公式,你會得到相同的字符時間,那麼對於第一個猜測,你正在測試befor得到的答案是爲什麼你應該使用

do 
{ 
} 
while(); 

代替

while() 
{ 
} 
+0

['rand'](http://en.cppreference.com/w/c/numeric/random/rand)函數不使用固定數組。 – 2014-10-29 13:01:56

+0

請使用「刪除」選項刪除答案。 – 2014-10-29 15:07:12

-3

如果你只是採取了字符輸入,T RY使用

getch(); 

,而不是

scanf(...); 

do 

{ 
} 
while(); 

,而不是

while() 
{ 
} 

,因爲你需要一個答案,那麼你做了測試...

+0

得到人物! getch! – indian 2014-10-29 13:09:03