【问题标题】:Loop to check whether one of two characters was entered runs forever循环检查是否输入了两个字符之一永远运行
【发布时间】:2020-04-16 21:20:44
【问题描述】:

我正在尝试编写一个代码,在我按下右键(m 或 o)后打印“Yayy”,但我被卡在了 while 函数中……我可以按任何东西,但它仍然会要求我按一些东西..

#include <stdio.h>
int main() {
    char input_char;
    printf("Press a key:");
    input_char = getc(stdin);
    printf("You pressed:%c\n", input_char);

    while (input_char != 'm' || input_char != 'o') {
        printf("Press a key:");
        input_char = getc(stdin);
        input_char = getc(stdin);
        printf("You pressed:%c\n", input_char);
    }
    printf("Yayyy");
}

【问题讨论】:

标签: c while-loop logical-operators


【解决方案1】:

您希望用户按 m 或 o,因此循环应该在输入不是 m 也不是 o 时运行。您需要更改此行:

while (input_char != 'm' || input_char != 'o')

到这里:

while (input_char != 'm' &amp;&amp; input_char != 'o')

【讨论】:

    【解决方案2】:

    考虑一下这个检查:

    while (input_char != 'm' || input_char != 'o') {
    

    这表示“循环而input_char 不是m 或input_char 不是o。”但如果你仔细想想,每个 字符要么不是m,要么不是o。 (你明白为什么吗?)结果,这将永远循环。

    要解决此问题,请将循环更改为读取

    while (input_char != 'm' && input_char != 'o') {
    

    它说“只要输入不是m 就循环并且输入不是o。”这样,如果输入为m 或输入为o,则循环停止运行。 (你明白为什么吗?)

    另一个小修复 - 没有理由在循环内调用 getc 两次。这会读取两个字符,但您只会记住其中一个。

    希望这会有所帮助!

    【讨论】:

    • 非常感谢.. 我现在感觉很愚蠢:D 我看了 2 天,却想不通:D facepalm
    • 别担心!这是程序员非常常犯的错误。因此,为自己学习了足够多的编码甚至犯了这个错误而庆幸自己,记下它以备将来使用,祝你好运!
    • 而且我在循环中调用 getc 两次 bcs 我的代码中的第一个 getc 将在我按 Enter 后离开“\n”......所以我需要摆脱它。可能对此的解决方案应该是这样的 scanf("%*[^\n])
    猜你喜欢
    • 2013-01-25
    • 2017-01-28
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多