Scanf рекурсивная функция запускает printf дважды? - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь создать функцию для получения пользовательского ввода, который является 'y' или 'n'.

#include <stdio.h>
#include "userinput.h"

bool userinput_get_yes_or_no(char message[]) {
    printf("%s [y/n]: \n", message);

    char answer;
    scanf_s(" %c", &answer, 1);

    if (answer == 'y') return true;
    if (answer == 'n') return false;

    return userinput_get_yes_or_no(message);
}

Это прекрасно работает, когда пользователь вводит только 'y', 'n',Когда вы вводите что-либо еще, но только 1 символ, он повторяет вопрос и печатает сообщение один раз.

НО Когда вы вводите что-либо длиннее 1 символа, сообщение повторяется несколько раз (столько раз, сколько символовВы ввели), прежде чем снова ждать ввода.

Что я делаю не так?

1 Ответ

1 голос
/ 14 июня 2019

Я повторил вашу проблему - в основном, ваш контроль перетек в следующий вызов вашей функции и обнаружил, что что-то уже находится в очереди stdin.Я нашел полезный ответ здесь, на c-faq.com , и добавил его к вашей функции:

bool userinput_get_yes_or_no(char message[])
{
    char answer;
    char c; /* for discard */
    printf("%s [y/n]: \n", message);
    scanf_s(" %c", &answer, 1);
    while((c = getchar()) != '\n' && c != EOF); /* discard */
    if (answer == 'y') {
        return true;
    }
    else if (answer == 'n') { 
        return false;
    }
    else {
        return userinput_get_yes_or_no(message);
    }
}

Я немного изменил поток управления для удобства чтения, не стесняйтесьигнорировать.Важной частью является строка с пометкой discard, в которой мы отбрасываем оставшуюся часть буфера, гарантируя, что при следующем вызове функции ничего не ждет.

...