我真的在这个问题上困扰了好几天。
下面的程序是更大程序的一部分,要求用户输入卡,例如。 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");
}
}
答案 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
不可能同时拥有所有这些值。