Один из моих циклов scanf запрашивает два ввода перед выполнением.Проблема пробелов? - PullRequest
0 голосов
/ 07 апреля 2019

Язык: C

Компилятор: Visual Studio 2017 / Win 32

Таким образом, в основном мне поручено сделать игру умножения, которая берет два случайных однозначных числа и предлагает пользователюумножьте их вместе.Программа должна быть пуленепробиваемой, поэтому она должна зацикливать пользователя до тех пор, пока он не введет правильный ввод (например, если они вводят букву, она должна зациклить их, пока они не введут правильный номер).Я попробовал пару вещей, и цикл do / while, кажется, работает довольно хорошо.Однако, когда пользователь вводит неправильный ответ и пытается снова, scanf в цикле 2ND do / while заставит их ввести два входа (игнорирует первый).Я имел эту проблему в прошлом и пытался бесчисленное количество раз, чтобы исправить ее, но я не могу найти решение.Любая помощь могла бы быть полезна.

Спасибо!

Пробовал с помощью fgets.Не удалось с треском.Я удалил getchar ()! = '\ N'.Это сработало, но тогда программа бесконечно зациклила бы «Пожалуйста, введите целое число».

    while (answer != correct)
    {
        srand(time(NULL));
        int wrong = 1 + rand() % 5;

        switch (wrong)
        {
        case 1:
            SetConsoleTextAttribute(h, FOREGROUND_RED | FOREGROUND_INTENSITY);
            printf("\n               ***\n");
            printf("              Wrong!\n");
            printf("               ***\n");
            SetConsoleTextAttribute(h, wOldColorAttrs);
            break;
        case 2:
            SetConsoleTextAttribute(h, FOREGROUND_RED | FOREGROUND_INTENSITY);
            printf("\n                ***\n");
            printf("               Nope!\n");
            printf("                ***\n");
            SetConsoleTextAttribute(h, wOldColorAttrs);
            break;
        case 3:
            SetConsoleTextAttribute(h, FOREGROUND_RED | FOREGROUND_INTENSITY);
            printf("\n                 ***\n");
            printf("              Not quite!\n");
            printf("                 ***\n");
            SetConsoleTextAttribute(h, wOldColorAttrs);
            break;
        case 4:
            SetConsoleTextAttribute(h, FOREGROUND_RED | FOREGROUND_INTENSITY);
            printf("\n              ***\n");
            printf("          Incorrect!\n");
            printf("              ***\n");
            SetConsoleTextAttribute(h, wOldColorAttrs);
            break;
        case 5:
            SetConsoleTextAttribute(h, FOREGROUND_RED | FOREGROUND_INTENSITY);
            printf("\n                 ***\n");
            printf("          Nope! Try again!\n");
            printf("                 ***\n");
            SetConsoleTextAttribute(h, wOldColorAttrs);
            break;
        }

        do {
        printf("Enter a number to represent your answer! ");
        while (getchar() != '\n');
        } while (scanf_s("%d", &answer) != 1);
        getchar();
    }

Я просто хочу, чтобы пользователь мог плавно вводить число без запутанной ошибки scanf.

1 Ответ

0 голосов
/ 07 апреля 2019

Вы можете получить входные данные, как в этом примере

#include <stdio.h>

int main(void)
{
    char anstr[100];
    int answer;
    do { 
        printf("Enter ... answer! ");
        if(fgets(anstr, sizeof anstr, stdin) == NULL) {
            return 1;
        }
    } while(sscanf_s(anstr, "%d", &answer) != 1);
    printf("The answer is %d\n", answer);
    return 0; 
}

, на том основании, что спецификатор формата %d будет использовать весь начальный пробел, а неправильный ввод будет сброшен при чтении другой строковой записи.

Сеанс программы:

Enter ... answer! alice
Enter ... answer! bob
Enter ... answer! 42
The answer is 42
...