2014-10-29 104 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