C getchar() игра Палач

Мне дали домашнее задание, которое поставило перед нами задачу создать простую игру палача. Ниже приведен код, который у меня есть. В настоящее время я пытаюсь использовать, если еще с 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");
    }
}

2 ответа

Когда вы вводите символ, который вы хотите getchar чтобы прочитать, вы заканчиваете его клавишей Enter, верно? Эта клавиша Enter также будет помещена во входной буфер stdin (который является то, что getchar читает из) как новую строку, '\n',

Это означает, что для каждого ввода вы вводите два символа.

Вам нужно пропустить эту новую строку. Это можно легко сделать, просто добавив вторую getchar после первого, как например

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

Хороший ответ уже есть, но чтобы прояснить проблему немного, вот простой фрагмент кода. Функция 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;
        }
    }
}

Это всего лишь часть проверочного кода, для этого могут быть более элегантные способы.

Другие вопросы по тегам