Fgets пропускается без видимой причины - PullRequest
0 голосов
/ 02 мая 2020

Мой код не работает, по какой-то причине он пропускает инструкцию "fgets", и я без устали пытаюсь решить эту проблему, но не могу. Я был в процессе создания простой C игры с бросанием 3 кубиков и выдачей результата, игрок мог бы догадаться, будет ли следующий результат выше, ниже или таким же, как предыдущий.

Вот код:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

int main(int argc, char *args[]) {
    printf("__________________________OPEN THE GAME!_________________________\n");
    printf("\tThe rules are simple,\n\twe are gonna roll 3 dices and\n\tgive you the result.\n\tYou're then going to guess if\n\tthe next roll is gonna be\n\thigher(h), lower(l) or same(s)!\n");
    //char ready[3];
    //printf("\t\t\tAre you ready? ");
    //fgets(ready, 2, stdin);

    int roll1;

    int roll2;

    int roll3;

    char enter[] = "y";

    while(strcmp(enter, "n")) 
    {
        roll1 = rand()%6 + 1;
        roll2 = rand()%6 + 1;
        roll3 = rand()%6 + 1;
        printf("First roll!\n%d\n\n", roll1);
        printf("Second roll!\n%d\n\n", roll2);
        printf("Third roll!\n%d\n\n", roll3);

        int firstResult = roll1 + roll2 + roll3;
        printf("Result: %d\n", firstResult);

        char guess[2];
        printf("\t\t\tWill the next one be h/l/s? ");
        fgets(guess, 2, stdin);

        int result = (rand()%6 + 1) + (rand()%6 + 1) + (rand()%6 + 1);

        if (((result == firstResult) && (strcmp(guess,"s"))) || ((result > firstResult) && (strcmp(guess,"h"))) || ((result < firstResult) && (strcmp(guess,"l"))))
        {
            printf("°°°°°°°°°°°Correct, you win!°°°°°°°°°°°\n");
            printf("      The result was: %d\n", result);
        }
        else
        {
            printf("\tI'm sorry, the new roll is %d :(\n", result);
        }

        printf("\tTry again?(y/n)");
        fgets(enter, 2, stdin);

        firstResult = result;
    }
    printf("\t\t\tGG, come back when you want to test your luck B)\n");
    return 0;
}

инструкция fgets, которую пропускают, находится внизу после повторной попытки. Может кто-нибудь объяснить мне, что мне не хватает? Даже с scanfs он не будет работать или использовать char вместо строк.

1 Ответ

1 голос
/ 02 мая 2020

fgets() буфер слишком мал.

Для ввода "h\n" необходимо как минимум 3, чтобы полностью сохранить как строку.

Использовать буфер большего размера.


После прочтения с помощью fgets() отрежьте потенциал '\n', чтобы заставить работать strcmp(guess,"s").

    char guess[100];
    printf("\t\t\tWill the next one be h/l/s? ");
    fgets(guess, sizeof guess, stdin);
    guess[strcspn(guess, "\n")] = '\0';

Подобные изменения необходимы для fgets(enter...

...