我正在尝试创建一个函数来获取用户输入的“ 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个字符,则消息将重复多次(输入的字符次数),然后再次等待输入。
我在做什么错了?
答案 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”的行,我们将丢弃缓冲区的其余部分,以确保没有等待下一次调用该函数的地方。