C-尝试从stdin读取单个字符(失败)w/scanf/getchar

C-尝试从stdin读取单个字符(失败)w/scanf/getchar,c,scanf,C,Scanf,作为家庭作业的一部分,我试图从stdin中读取一个字符,并根据它进行操作: char choice; while (1) { printf("please enter [y]es, [n]o or [m]aybe: "); scanf("%c", choice); fflush(stdin); // validate input if (choice == 'y' || choice == 'n' || choice == 'm') {

作为家庭作业的一部分,我试图从stdin中读取一个字符,并根据它进行操作:

char choice;

while (1) {
    printf("please enter [y]es, [n]o or [m]aybe: ");
    scanf("%c", choice);
    fflush(stdin);
    // validate input
    if (choice == 'y' || choice == 'n' || choice == 'm') {
        break;
    } else {
      printf("Please enter only \'y\', \'n\' or \'m\'!\n");
    }
}
// do something with the input
if (choice == 'y') {
    printf("you selected yes!\n");
}
出于某种原因,scanf会在之后捕获字符和换行符,因此它会继续对输入进行处理,然后还会打印“请仅输入‘y’、‘n’或‘m’!”行。如果我在stdin上输入几个字符,它将为所有字符打印该行,同时也为第一个字符正确执行。例如:

$/运行
请输入[y]es、[n]o或[m]aybe:y
你选择了是!
请只输入“y”、“n”或“m”!
美元/次
请输入[y]es、[n]o或[m]aybe:是
你选择了是!
请只输入“y”、“n”或“m”!
请只输入“y”、“n”或“m”!
请只输入“y”、“n”或“m”!
$

如果我使用getchar,也会发生同样的事情。我错过了什么?谢谢。

您需要在
scanf(
%c
之间留出一个空间,才能使其正常工作:

scanf(" %c", &choice);
你还需要使用&选择,而不是选择

编辑:当你在做这项工作时,你可能想研究一下这个循环的
do While()
(除非教授特别说使用
break
)-
do While
在验证用户输入时效果很好!

更好的是,使用fgetc()。scanf()应该是最后的选择。

fflush()
不是ISO C为输入流定义的。它是在Microsoft的C运行时库中定义的,但不可移植

当用户输入预期数据时,“空格在%c之前”解决方案可能会起作用,但它会在许多方面失败;例如,尝试输入“y n”。控制台输入是面向行的;您最好的选择是确保放弃整行,因此:

scanf( "%c", &choice ) ;
while( choice != '\n' && getchar() != '\n' ) /* do nothing*/ ;

首先,我会保持简短。因为没有足够的分数提交评论 如果我们可以看到o/p的数量是(一+字符的数量) 这是因为我们在输入字符“\n”后按enter键,该字符是不可打印的字符,也会添加到字符串后面

$ ./run
please enter [y]es, [n]o or [m]aybe: y<return>
you selected yes!
Please enter only 'y', 'n' or 'm'!  -----------> it is due to reading of the '\n' by scanf
$/运行
请输入[y]es、[n]o或[m]aybe:y
你选择了是!
请仅输入“y”、“n”或“m”!------------->这是由于scanf读取了“\n”
编辑 由于分数不够,我可以将此作为评论发布。这是上述答案的一个变通方法


直到你得到意外的输入,试着输入“y x z”例如。哈哈,这是一个传奇!这是一个解决问题的办法,不是吗?所以这是一个对问题的评论(不是答案)。没有足够的分数,我想,但不知道我会投赞成票。