6

作为家庭作业的一部分,我试图从标准输入读取单个字符,并按照它行事:

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'!” 线。如果我在标准输入上输入几个字符,它将为所有字符打印该行,同时也为第一个字符正确执行。因此,例如:

$ ./run
please enter [y]es, [n]o or [m]aybe: y<return>
you selected yes!
Please enter only 'y', 'n' or 'm'!
$ ./run
please enter [y]es, [n]o or [m]aybe: yes<return>
you selected yes!
Please enter only 'y', 'n' or 'm'!
Please enter only 'y', 'n' or 'm'!
Please enter only 'y', 'n' or 'm'!
$

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

4

4 回答 4

12

您需要在scanf("和之间留一个空格%c才能正常工作:

scanf(" %c", &choice);

而且你还需要使用&choice,而不是choice!

编辑:当您使用它时,您可能想要查看do while()该循环(除非教授特别说要使用 a break) -do while在验证用户输入时效果很好!

于 2009-12-24T18:08:27.060 回答
5

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

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

scanf( "%c", &choice ) ;
while( choice != '\n' && getchar() != '\n' ) /* do nothing*/ ;
于 2009-12-24T19:16:31.680 回答
4

更好的是,使用 fgetc()。scanf() 应该始终是最后的手段。

于 2009-12-24T18:13:02.777 回答
0

首先我会保持简短。因为提交评论的积分不足如果我们可以看到o / p的数量是(一个+字符的数量)这是因为我们在输入字符后按Enter键'\ n ' 这是不可打印的字符也被添加到你的字符串之后。

$ ./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

已编辑由于积分不足,我可以将此作为评论发布。这是上述答案的解决方法

于 2015-11-14T14:54:27.353 回答