开关没有做我想做的事

时间:2016-11-13 14:48:43

标签: c

我的任务是一个简单的布尔计算器

我想制作一个简单的布尔计算器,它使用OR,AND,NAND和XOR。这就是它必须做的事情:

如果用户随时输入以q开头的字符串(如quit),程序应立即退出。如果用户随时输入以c开头的字符串(如cancel),则程序应中止当前计算并再次请求第一个参数。如果用户输入0以外的任何内容,1或以cq开头的字符串,则应显示错误(请参阅下文)并要求同样的价值。

现在,我知道这可能非常愚蠢,但我现在开始编程...

我输入的内容并不重要,它只会重新选择"您选择退出!" 为什么它会忽略"开关?

#include <stdio.h>
#include <stdlib.h>

int main() {
    // Declaration Part
    char user_input[100];

    //Main Body
    gets(user_input);
    while (user_input[0] == !'q') {
        switch (user_input[0]) {
          case '0':
          case '1':
            printf("You chose boolean algebra! \n");
            break;
          case 'c':
            printf("%s\n", "You chose to continue!");
            continue;
        }
    }
    printf("You chose to quit! \n");
    return 0;
}

3 个答案:

答案 0 :(得分:0)

您的代码中存在两个主要问题:

  • 条件while (user_input[0] == !'q')应写为while (user_input[0] != 'q')

  • 绝不应使用过时的函数gets()。请改用fgets()

  • 你没有在while循环中读取新行...条件是常量,你有一个无限循环(如果你直接输入)或者你永远不会输入。

这是一个更好的版本:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    // Declaration Part
    char input[100];

    //Main Body
    while (fgets(input, sizeof input, stdin) != NULL && input[0] != 'q') {
        switch (input[0]) {
          case '0':
          case '1':
            printf("You chose boolean algebra! \n");
            break;
          case 'c':
            printf("%s\n", "You chose to continue!");
            continue;
        }
    }
    printf("You chose to quit!\n");
    return 0;
}

答案 1 :(得分:0)

运算符!是布尔值,如果操作数非零,则结果为false,在条件表达式中隐式转换为零:

user_input[0] == !'q'

您只是将user_input[0]与零进行比较,因此永远不会输入切换。也就是说它不是没有做你想要的开关 - 它是if(...)中不正确的布尔表达式。

您需要的是二元运算符 !=

user_input[0] != 'q'

答案 2 :(得分:0)

  

为什么“忽略”开关?

它不是执行开关,因为它位于条件从不为真的条件块内。你正在解决代码的错误部分;为什么它不执行切换应该是显而易见的,你应该问的问题是“为什么while条件永远不会是真的?”。

运算符!是布尔值,如果操作数非零,则结果为false,与整数相比,它隐式地转换为零。在你的条件表达式中:

user_input[0] == !'q'

您只是将user_input[0]与零进行比较,因此循环体永远不会输入。所以它不是没有做你想要的开关 - 它是while(...)中不正确的布尔表达式。

您需要的是二元运算符 !=

user_input[0] != 'q'