c - Scanf 递归函数触发 printf 两次



我正在尝试创建一个函数来获取用户输入,该输入要么是"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 个字符的内容时,消息会重复多次(与您输入的字符一样多(,然后再次等待输入。

我做错了什么?

我复制了你的问题 - 基本上,你的控件正在流入函数的下一次调用,并在 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 的行,我们丢弃缓冲区的其余部分,确保没有任何东西等待下一次调用函数。

最新更新