为什么还要进去呢?

时间:2018-12-11 18:29:18

标签: char scanf

我真的在这个问题上困扰了好几天。

下面的程序是更大程序的一部分,要求用户输入卡,例如。 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");
    }
}

1 个答案:

答案 0 :(得分:0)

您的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'

如您所见,您的代码会首先检查suit1是否不是'c'。有两种可能性:

  • Suit1不是'c' =>表达式返回true
  • Suit1'c' =>程序继续并检查Suit1是否是'd'。仅当Suit1'c'时程序才到达此点。由于'c' != 'd'的条件是true,因此您的程序将始终执行else if块中的代码。


重写条件

您可以将表达式更改为使用and &&而不是or ||并反转整个内容。

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

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