首页 > 解决方案 > else if 为什么还要进去?

问题描述

我现在真的被这个问题困了好几天了..

下面的程序是一个更大程序的一部分,它要求用户输入一张卡,例如。2d 代表(2 颗钻石)。我的问题出在函数“rank”中,我向它发送了一个字符串指针,使用 sscanf 它会找出用户输入的数字和字符。假设用户输入了 2d,程序继续进入这个(否则 if(suit1 != 'c' || suit1 != 'd' || suit1 != 'h' || suit1 != 's') 并且我真的不明白为什么,请帮助?

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

void rank (const char *s);

int main(){

    char text [20];

    printf("enter 2d");
    fgets(text, 4, stdin);

    rank(text);

    return 0;
}

void rank ( const char *s) {

    int num;
    char suit1;

    if((sscanf(s,"%d %c", &num , &suit1 )) == 2 ){

        if(num == 0 || num == 1){
            printf("bad rank 0 or 1");
            return 0;
        }
        else if(suit1 != 'c' || suit1 != 'd' || suit1 != 'h' || suit1 != 's'){
           printf("Bad suit1!\n");
           return 0;
        }
        else
            printf("ok");
    }
}

标签: charscanf

解决方案


您的状况else if将始终评估为true

suit1 != 'c' || suit1 != 'd' || suit1 != 'h' || suit1 != 's'


解决方案

你的正确条件else if是这样的

!(suit1 == 'c' || suit1 == 'd' || suit1 == 'h' || suit1 == 's') // Using OR
suit1 != 'c' && suit1 != 'd' && suit1 != 'h' && suit1 != 's'    // Using AND


打破它

让我们将您的表达式分解为单个条件:

suit1 != 'c' // Suit1 is not 'c'
suit1 != 'd' // Suit1 is not 'd'
suit1 != 'h' // Suit1 is not 'h'
suit1 != 's' // Suit1 is not 's'

如您所见,您的代码首先检查 if suit1is not 'c'。有两种可能:

  • Suit1is not 'c'=> 表达式返回true
  • Suit1is 'c'=> 程序继续并检查是否Suit1is 'd'Suit1程序只有在是时才会到达这一点'c'。由于'c' != 'd'条件是true并且您的程序将始终执行else if块中的代码。


重写条件

您可以更改表达式以使用and &&而不是or ||反转整个事物。

!(suit1 == 'c' && suit1 == 'd' && suit1 == 'h' && suit1 == 's')

使用这种语法,您可以清楚地看到不可能suit1同时拥有所有这些值。


推荐阅读