我尝试运行一些C代码(下面):
#include <stdio.h>
int main()
{
int option;
do {
printf("Enter either y/n: ");
option = fgetc(stdin);
printf("\n");
} while ((option != 'y') || (option != 'n'));
printf("You Pressed Yes/No\n\n");
}
我不知道实际问题,但它没有退出循环。 还有一件事,当我按下任何一个角色时,或者&#39; y&#39;或者&#39; n&#39;或者它打印提示两次的任何字符或我输入的字符数 如果有人可以稍等片刻告诉我我错在哪里,那将是非常感激的。谢谢
答案 0 :(得分:3)
您希望在option
与'y'
不同且与'n'
不同时循环播放。
让我们考虑以下真值表:
opt | opt != 'y' | opt != 'n' | opt != 'y' OR opt != 'n' | opt != 'y' AND opt != 'n'
------+------------+------------+--------------------------+---------------------------
'x' | true | true | true | true
'y' | false | true | true | false
'n' | true | false | true | false
答案 1 :(得分:2)
while ((option != 'y') || (option != 'n'))
中的条件始终为真。
你应该这样写这个测试:
while ((option != 'y') && (option != 'n'));
请注意,如果到达输入流的末尾,fgetc()
将始终返回EOF
,循环将无限期运行。通过测试EOF
:
while (option != EOF && option != 'y' && option != 'n');
您获得单个输入的多个答案的原因是stdin
是行缓冲的,因此您需要键入enter
以让程序接收输入。这使得程序可以使用完整的字符行,包括尾随换行符。
没有可移植的方式来关闭此行缓冲,因为它实际上是由终端执行的。
答案 2 :(得分:0)
您希望只要
继续循环((option != 'y') || (option != 'n'))
这意味着如果1下显示的条件不为真,你想离开循环,即
!((option != 'y') || (option != 'n'))
关注De Morgan's Law这个(按照1)
((option != 'y') || (option != 'n'))
与
相同!((option == 'y') && (option == 'n'))
将3插入2导致
!!((option == 'y') && (option == 'n'))
与
相同((option == 'y') && (option == 'n')
因此,如果option
同时等于y
和n
,则您希望离开循环。这显然不会是这种情况。 : - )