如何将字符与C中的不同字母进行比较?

时间:2015-11-11 13:53:57

标签: c loops while-loop char compare

这是我的代码。

char ask_for_command(){
    char letter;
    printf("Command: ");
    scanf(" %c", &letter);
    while(letter != 'a' || letter != 'd' || letter != 'w' || letter != 'x'){
        printf("NEW MOVEMENT: Enter a valid command by keyword:\n");
        printf("Valid commands: a d w x\n");
        scanf(" %c", &letter);
    }
    return letter;
}

while循环的工作原理如下。

while(letter != 'a'){}

但不是这样。

while(letter != 'a' || letter != 'd' || letter != 'w' || letter != 'x'){}

任何人都可以向我解释原因吗?先谢谢你。

3 个答案:

答案 0 :(得分:2)

您希望使用&&代替||进行比较。想一想:letter始终不等于'a'或不等于d。如果你的信是a,它仍然不等于b,所以它不等于a或不等于b。你想要的是一个既不等于'a',也不等于'd',也不等等的字母。请注意,α和β都不是(α或β)不同的。

letter提供初始值(您不想要的值,例如'a')或使用do - while循环也是一个好主意像这样:

do {
    printf("NEW MOVEMENT: Enter a valid command by keyword:\n");
    printf("Valid commands: a d w x\n");
    scanf(" %c", &letter);
} while (letter != 'a' && letter != 'd' && letter != 'w' && letter != 'x');

或者,您可以将strchr用于此目的:

while (strchr("adwx", letter) == NULL)

使用#include <string.h>时,请不要忘记strchr

答案 1 :(得分:2)

我认为ask_for_command()要求用户在adwx之间进行选择。

为什么你的解决方案都不起作用

如果你写下来,它就不会工作:

while(letter != 'a' || letter != 'd' || letter != 'w' || letter != 'x')

实际上,想象如果用户选择w(例如)会发生什么:

letter != 'a' -> TRUE
letter != 'd' -> TRUE
letter != 'w' -> FALSE
letter != 'x' -> TRUE

因此,陈述是:

while (TRUE || TRUE || TRUE || FALSE || TRUE) # You will enter the loop

如果您选择adx而不是w,则会发生同样的事情。

如果你写

,它就不会工作
while(letter != 'a')

的确,如果用户输入w,则语句为truew != a),您将进入循环。

你应该做什么

使用while进行无限循环。只要用户没有提供有效的命令,你就把他留在里面:

char ask_for_command(){
    // Valid commands
    char commands[] = "awxd"
    char letter;
    printf("Command: ");

    while (1) {
        // You ask for the command
        scanf(" %c", &letter);

        // Is it a valid command? If so, we can return it
        if (memchr(commands, letter, strlen(commands)) != NULL)
            return letter;

        // It looks like the command given was invalid! 
        printf("NEW MOVEMENT: Enter a valid command by keyword:\n");
        printf("Valid commands: a d w x\n");
    }
}

编辑:使用memchr,如评论中提到的F​​UZxxl。

答案 2 :(得分:1)

while(letter != 'a' || letter != 'd' || letter != 'w' || letter != 'x'){

是一个永远不会结束的循环。您可能想要逻辑AND而不是逻辑OR。

在C中的AND用&&表示 C中的OR用||

表示

因此,您应该将代码修改为:

while(letter != 'a' && letter != 'd' && letter != 'w' && letter != 'x'){

这意味着WHILE letter不是d,NOR w,NOR x

你原来的意思是:

虽然字母不是d或不是x或不是w

由于某些内容不能同时为dxw,因此总是如此