即使在按y或否之后,我也无法摆脱这个循环

时间:2016-08-14 16:50:40

标签: c

我尝试运行一些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;或者它打印提示两次的任何字符或我输入的字符数 如果有人可以稍等片刻告诉我我错在哪里,那将是非常感激的。谢谢

输出: Output of the above code(Sorry for the link)

3 个答案:

答案 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)

  1. 您希望只要

    继续循环
    ((option != 'y') || (option != 'n'))
    
  2. 这意味着如果1下显示的条件不为真,你想离开循环,即

    !((option != 'y') || (option != 'n'))
    
  3. 关注De Morgan's Law这个(按照1)

    ((option != 'y') || (option != 'n'))
    

    相同
    !((option == 'y') && (option == 'n'))
    
  4. 将3插入2导致

    !!((option == 'y') && (option == 'n'))
    

    相同
    ((option == 'y') && (option == 'n')
    

    因此,如果option同时等于yn,则您希望离开循环。这显然不会是这种情况。 : - )