C getchar() 刽子手游戏

Posted

技术标签:

【中文标题】C getchar() 刽子手游戏【英文标题】:C getchar() hangman game 【发布时间】:2017-02-24 08:25:50 【问题描述】:

我接到了一项家庭作业,任务是创建一个简单的刽子手游戏。下面是我的代码。我目前正在尝试使用 if else 和getchar() 来要求用户输入一个小写字母,看看它是否与他们应该猜测的单词中的一个字母匹配。根据我非常有限的经验,我拥有的代码应该可以工作,当我逐步执行程序时,它看起来好像应该正常运行,但是当我实际运行程序时,它似乎跳过了第二个getchar()。有人有什么建议或帮助吗?

#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");
    

【问题讨论】:

什么是int(a); ...您的声明对于初学者来说不正确...尝试int a; 另外a == 0;a与零的比较,不是 将零分配给 a,试试a = 0; 这是垃圾代码。 c == 0; 等。不要做任何事情。 这里有几个问题。但您的主要问题是关于getchar()。答案是您忘记了 NEWLINE 字符:Clarification needed regarding getchar() and newline 您不能为每个字符编写单独的 if 语句。这不是怎么做的。如果您发现自己再次编写同一行代码,那么您可能做错了什么。 【参考方案1】:

当你输入一个你想让getchar 读取的字符时,你用 Enter 键结束它,对吗? Enter 键将作为换行符'\n' 放入stdin(这是getchar 读取的内容)的输入缓冲区。

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

您需要跳过该换行符。只需在第一个 getchar 之后添加第二个 getchar 即可轻松完成,例如

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

【讨论】:

并且x 应该输入int,这样您就可以在用户取消输入之前检查if (x == EOF) return 1; ,否则您将在第二个getchar 上被阻止第二个getchar.【参考方案2】:

已经有一个很好的答案,但要澄清 问题有点多,这里是一段简单的代码。 函数 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;
        
    

这只是一段概念验证代码,可能有更优雅的方法来解决这个问题。

【讨论】:

以上是关于C getchar() 刽子手游戏的主要内容,如果未能解决你的问题,请参考以下文章

在C语言中getchar()如何用

c语言中(c=getchar())!=EOF与c=getchar()!=EOF的区别?

c语言getchar的用法

C语言中getchar()怎么用?

noip2013——提高组——转圈游戏

C语言getchar()和EOF