Scanf递归函数触发printf两次?

时间:2019-06-13 18:30:55

标签: c scanf

我正在尝试创建一个函数来获取用户输入的“ 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 个答案:

答案 0 :(得分:1)

我复制了您的问题-基本上,您的控件正在流入您的函数的下一个调用,并在stdin队列中找到了某些东西。我找到了一个有用的答案here on 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”的行,我们将丢弃缓冲区的其余部分,以确保没有等待下一次调用该函数的地方。