C-while循环不会退出

时间:2018-09-12 23:06:28

标签: c while-loop

我正在为学校实验室创建一块石头,纸,剪刀代码。我只是想测试无效条目,但是尽管输入了有效字符,但我仍陷于连续的while循环中。

printf("\nEnter (r)ock, (p)aper, or (s)cissors. Enter (q) to quit.");
scanf("%c", &input);
if(input=='Q' || input=='q') {
     return 0;
}
while(input!='R' || input!='r' || input!='P' || input!='p' || input!='S' || input!='s' || input!='Q' || input!='q') {
        printf("\nInvalid entry! Please enter (r)ock, (p)aper, or (s)cissors. Enter (q) to quit.");
        scanf(" %c", &input);
}

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

您需要将while循环中的所有OR运算符更改为AND运算符。如果它们是OR运算符,则所有输入均为true。

`

printf("\nEnter (r)ock, (p)aper, or (s)cissors. Enter (q) to quit.");
scanf("%c", &input);
if(input=='Q' || input=='q') {
     return 0;
}
while(input!='R' && input!='r' && input!='P' && input!='p' && input!='S' && input!='s' && input!='Q' && input!='q') {
        printf("\nInvalid entry! Please enter (r)ock, (p)aper, or (s)cissors. Enter (q) to quit.");
        scanf(" %c", &input);
}

`

答案 1 :(得分:1)

似乎您的代码中存在经典的逻辑错误。我也花了一些时间来捕捉它,因为使用or(||)似乎很有意义。但是,在这种情况下,如果您考虑一下,计算机将正确地遵循您的说明,并且永远不会让您离开循环。您真正的意思是,如果您输入的内容不同于'R'和({&&)'r'和'P'和'p'...,那是无效的。

在另一个不相关的主题上,始终检查输入函数调用的返回值可能是一个好主意。在这种情况下,您可能想要编写类似

的内容
while (1) { /* infinite loop */
    printf("\nEnter (r)ock, (p)aper, or (s)cissors. Enter (q) to quit.");
    if (scanf(" %c", &c) != EOF) {
        if (c == 'q' || c == 'Q') {
            break;
        } else if (c == 'r' || c == 'R') {
            /* rock */
        } else if (/* paper, etc... */) {
            /* ... */
        } else {
            /* you can say here that the input is not valid */
        }
    } else {
        printf("\nBye!\n");
        break;
    }
}

如果使用* NIX终端(例如Linux或BSD),则作为“奖励”,您将可以通过键入Ctrl-D(^ D)退出循环,这将导致scanf返回EOF 。请记住,如果您曾经写过无限循环(例如在我的示例中,while(1)循环),请务必格外小心。您必须提供一些摆脱这些循环的方法。