我试图接受用户的输入并检查它是否等于某个选项(' +',' - ',&# 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.: ")
被多次执行而我无法理解原因,因此如果我尝试插入,例如+
,这就是打印输出:
++
提前致谢
答案 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);
}