C:使用scanf,多个输入执行操作

时间:2016-01-06 15:43:27

标签: c

我试图接受用户的输入并检查它是否等于某个选项(' +',' - ',&# 39 *'' X&#39)

    do {
        printf("Select the op.: ");
        scanf("%c", &option);
    } while (option != '+' || option != '-' || option != '*' || option != 'x');
    printf("%c", option);

这是输出:

Select the op.:Select the op.:Select the op.:Select the op.:

正如您所看到printf("Select the op.: ")被多次执行而我无法理解原因,因此如果我尝试插入,例如+,这就是打印输出:

++

提前致谢

4 个答案:

答案 0 :(得分:11)

while(option != '+' || option != '-' || option != '*' || option != 'x');

这种情况总是如此。

答案 1 :(得分:3)

您使用的条件始终为真。您应该使用&&代替||。制作真值表以便自己验证。 你为什么不用strchr?条件会更优雅:

do {
    printf("Select the op.: ");
    if (1 != scanf(" %c", &option)) break;
} while (!strchr("+-*x", option));

另外,对于您的其他问题,考虑到printf的多次执行是缓冲区的事实,将换行符保留为使用类型,以便将其选项发送到scanf。因此,在下一个循环中,scanf将接受前一循环的换行符。它不是一个有效的选项,因此,下一个循环将再次询问您。 您可以通过这样写scanf来更正它:scanf(" %c", &option)这只是因为你知道你只想丢弃一个空格字符。这不是一个历史性的解决方案。

答案 2 :(得分:2)

您的终止条件不符合您的要求。试试这个:

do
{
   ...
}
while( option != '+' && option != '-' && option != '*' && option != 'x');

这意味着只要option不是+而不是-而不是*而不是x,就可以继续循环。

相同的条件是:

do
{
   ...
}
while( !( option == '+' || option == '-' || option == '*' || option == 'x' ) );

除了scanf的这个检查返回值,正如gon1332在他的完美答案中所做的那样。

答案 3 :(得分:0)

尽管他的标准并没有在输入流上使用fflush(),但它已被记录并可在许多Linux / Unix系统上运行。所以以下内容可能适用于您,但它不可移植:

{
    printf("Select the op.: ");
    fflush(stdin);
    scanf("%c", &option);
}