2017-02-24 95 views
0

我被赋予了一项家庭作业任务,其任务是创建一个简单的hang子手游戏。以下是我的代码。我目前正在尝试使用getchar()来请求用户输入一个小写字母,并查看它是否与他们应该猜测的单词中的某个字母匹配。从我非常有限的经验来看,我拥有的代码应该可以工作,并且当我逐步完成程序时,它看起来应该正常运行,但是当我真正运行该程序时,似乎跳过第二个getchar()。任何人有任何建议或帮助?C getchar()hang子手游戏

#include "stdio.h" 
#include "math.h" 

int main(void) { 
    int(a); 
    int(b); 
    float(x); 
    float(c); 
    float(e); 

    int word[4] = {116, 101, 115, 116}; 
    int guess[4]; 

    c == 0; 
    a == 0; 
    b == 0; 

    printf("Welcome to Hangman\n"); 
    printf("Input a word--one lower case letter at a time\n"); 
    printf("Enter Guess: "); 

    x = getchar(); 

    if (x > 122) { 
     printf(" Error, character must be a lowercase letter"); 
    } else 
    if (x < 97) { 
     printf(" Error, character must be a lowercase letter"); 
    } else 
    if (x == 116) { 
     printf("t is correct\n"); 

     printf("%d", word[0]); 
     printf(" _"); 
     printf(" _"); 
     printf(" %d ", word[3]); 

     e = getchar(); 

     if (e == 101) { 
      printf("e is correct\n"); 

      printf("%d", word[0]); 
      printf(" %d", word[1]); 
      printf(" _"); 
      printf(" %d ", word[3]); 
     } else 
     if (e == 115) { 
      printf("s is correct\n"); 

      printf("%d", word[0]); 
      printf(" _"); 
      printf(" %d", word[2]); 
      printf(" %d", word[0]); 
     } else { 
      printf(" You guessed wrong"); 
     } 
    } else 
    if (x == 101) { 
     printf("e is correct\n"); 
     printf("_"); 
     printf(" %d", word[1]); 
     printf(" _"); 
     printf(" _ "); 
    } else 
    if (x == 115) { 
     printf("s is correct\n"); 

     printf("_"); 
     printf(" _"); 
     printf(" %d", word[2]); 
     printf(" _ "); 
    } else { 
     printf(" You guessed wrong"); 
    } 
} 
+2

什么是int(a);你的声明对于初学者是不正确的...尝试'int a;'也是'a == 0;'是'a'与零的比较,**不**为* * a *赋值零,尝试'a = 0;' –

+3

这是垃圾代码。 –

+1

'c == 0;'等人。不要做任何事情。 – Biffen

回答

2

当你输入你想getchar读取一个字符,你用结束它进入关键吧?那输入键将被放入输入缓冲区stdin(这是什么getchar读取)作为换行符,'\n'

这意味着对于您输入的每个输入,您实际上输入了两个个字符。

您需要跳过该换行符。这很容易只需添加第二getchar第一后,例如像做

x = getchar(); 
getchar(); // Read the newline from the Enter key 
+2

而'x'应该输入'int',这样你可以检查if(x == EOF){return 1; }'在用户取消输入**之前**你的第二个'getchar'或者你将在第二个'getchar'上阻塞。 –

0

已经有一个很好的答案,但澄清 问题有点多,下面是一段简单的代码。 函数get_character将返回第一个输入的字符 并消耗所有后续字符,直到下一个'\n'

如果一个字符是EOF,它不会阻止。

#include<stdio.h> 
int get_character(void); 

int main(void) 
{ 
     printf("character > "); 
     int c = get_character(); 
     while(c != EOF && c != 'q') 
     { 
       printf("You entered %c\n", c); 
       printf("character > "); 
       c = get_character(); 
     } 
} 

int get_character(void) 
{ 
     int c = getchar(), next_c; 
     if(c == EOF) 
     { 
       return EOF; 
     } 
     next_c = getchar(); // consume all \n 
     while(next_c != '\n' && next_c != EOF) 
     { 
       fprintf(stderr, "WARNING: consumed non-newline character: 0x%x\n", next_c); 
       next_c = getchar(); 
     } 
     return c; 
} 

顺便说一句:你是能够解决更快刽子手方式:

int get_character(void); 
#define MAX_TRIALS 3 
#define WORD_LEN 4 

int main(void) 
{ 
    char word[WORD_LEN + 1] = "test"; 
    char correct[WORD_LEN] = {0, 0, 0, 0}; 
    int trials = 0; 
    while(1) 
    { 
     if(trials > MAX_TRIALS) 
     { 
      printf("You failed. The word was: %s\n", word); 
      return 0; 
     } 

     printf("character > "); 
     int c = get_character(); 
     if(c == EOF) 
     { 
      printf("bye\n"); 
      return 0; 
     } 

     int i, this_char_correct = 0; 
     for(i = 0; i < WORD_LEN; i++) 
     { 
      if(c == word[i]) 
      { 
       correct[i] = 1; 
       this_char_correct = 1; 
      } 
      if(correct[i]) 
      { 
       printf("%c", word[i]); 
      } 
      else 
      { 
       printf("_"); 
      } 
     } 
     if(!this_char_correct) 
     { 
      trials++; 
     } 
     int word_done = 1; 
     for(i = 0; i < WORD_LEN; i++) 
     { 
      word_done &= correct[i]; 
     } 
     if(! word_done) 
     { 
      printf("\nYou have %d trials left\n", WORD_LEN - trials); 
     } 
     else 
     { 
      printf("\nYou got it.\n"); 
      return 0; 
     } 
    } 
} 

这只是一张证明了概念代码有可能是解决这种方式更优雅的方式。