Char 为什么还要进去呢?
我真的陷入这个问题好几天了 下面的程序是一个更大程序的一部分,它要求用户输入一张卡,例如2d,代表(2个钻石)。我的问题是在函数“rank”中,我向它发送一个字符串指针,通过sscanf,它将计算出用户输入的数字和字符。让我们假设用户输入了2d,程序将继续运行(否则如果(Suite1!='c'| | | Suite1!='d'| | Suite1!='h'| | Suite1!='s'),我真的不明白为什么,请帮帮我Char 为什么还要进去呢?,char,scanf,Char,Scanf,我真的陷入这个问题好几天了 下面的程序是一个更大程序的一部分,它要求用户输入一张卡,例如2d,代表(2个钻石)。我的问题是在函数“rank”中,我向它发送一个字符串指针,通过sscanf,它将计算出用户输入的数字和字符。让我们假设用户输入了2d,程序将继续运行(否则如果(Suite1!='c'| | | Suite1!='d'| | Suite1!='h'| | Suite1!='s'),我真的不明白为什么,请帮帮我 #include <stdio.h> #include <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'))
与您的原始条件相同,它只是用逻辑的&
而不是|
表示。我想更清楚的是,这永远不会计算为真。您要使用的正确条件是我放在答案顶部的条件之一(正如您已经知道的)。