Char 为什么还要进去呢?

Char 为什么还要进去呢?,char,scanf,Char,Scanf,我真的陷入这个问题好几天了 下面的程序是一个更大程序的一部分,它要求用户输入一张卡,例如2d,代表(2个钻石)。我的问题是在函数“rank”中,我向它发送一个字符串指针,通过sscanf,它将计算出用户输入的数字和字符。让我们假设用户输入了2d,程序将继续运行(否则如果(Suite1!='c'| | | Suite1!='d'| | Suite1!='h'| | Suite1!='s'),我真的不明白为什么,请帮帮我 #include <stdio.h> #include <s

我真的陷入这个问题好几天了

下面的程序是一个更大程序的一部分,它要求用户输入一张卡,例如2d,代表(2个钻石)。我的问题是在函数“rank”中,我向它发送一个字符串指针,通过sscanf,它将计算出用户输入的数字和字符。让我们假设用户输入了2d,程序将继续运行(否则如果(Suite1!='c'| | | Suite1!='d'| | Suite1!='h'| | Suite1!='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");
    }
}
#包括
#包括
无效等级(常量字符*s);
int main(){
字符文本[20];
printf(“输入2d”);
fgets(文本,4,标准文本);
排名(文本);
返回0;
}
无效秩(常量字符*s){
int-num;
字符集1;
如果((sscanf、%d%c、&num和&suite1))==2){
如果(num==0 | | num==1){
printf(“错误排名0或1”);
返回0;
}
else if(suite1!=“c”| suite1!=“d”| suite1!=“h”| suite1!=“s”){
printf(“坏西装1!\n”);
返回0;
}
其他的
printf(“ok”);
}
}

您的
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'
。有两种可能性:

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

重写条件 您可以将表达式更改为使用
和&
而不是
或| |
并反转整个内容

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

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

非常感谢Felix的回答。我编写的代码如下:
else if(!(suite1='c'&suite1='d'&suite1='h'&suite1='s'))
就像你说的,或者可能我把你的答案弄错了?但这对我不起作用。但后来我改为:
如果(suite1!='c'&&suite1!='d'&&suite1!='h'&&suite1!='s')
现在它工作正常了。
!(suite1='c'&suite1='d'&suite1='h'&suite1='s'))
与您的原始条件相同,它只是用逻辑的
&
而不是
|
表示。我想更清楚的是,这永远不会计算为真。您要使用的正确条件是我放在答案顶部的条件之一(正如您已经知道的)。