char - 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");
}
}
解决方案
您的状况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 suit1
is not 'c'
。有两种可能:
Suit1
is not'c'
=> 表达式返回true
Suit1
is'c'
=> 程序继续并检查是否Suit1
is'd'
。Suit1
程序只有在是时才会到达这一点'c'
。由于'c' != 'd'
条件是true
并且您的程序将始终执行else if
块中的代码。
重写条件
您可以更改表达式以使用and &&
而不是or ||
反转整个事物。
!(suit1 == 'c' && suit1 == 'd' && suit1 == 'h' && suit1 == 's')
使用这种语法,您可以清楚地看到不可能suit1
同时拥有所有这些值。
推荐阅读
- apache-spark - 火花驱动程序如何处理大于其内存的数据?想想集群上的 TB 数据,我们通过键或收集进行减少
- amazon-s3 - AWS 编码使用负载均衡器部署多个应用程序
- apache-spark - 使用 spark sql 时如何在程序中获取当前正在运行的作业信息
- ios - Sinch 不支持快速视频通话
- android - 如何在 Android 应用程序中使用“苹果系统字体”
- python - Spark(使用pyspark)使用一个数据帧(结构化流)中的值来查询静态数据帧并将第二个df中的行与第一个合并
- vba - 加载图像会使列表框和文本框闪烁一次
- html - 如何制作最细的字体
- python - 使用具有相同行值的其他列计算 Pandas 中列的模式
- ant - 如果另一个属性以特定字符开头,如何在 ant 中设置一个属性?