我知道我在 C 方面不是很好,但我认为我可以做到这一点:
if(strlen(type) == 0 || strcmp(type,"in")!=0 || strcmp(type,"out")!=0)
type
作为一个char*
,我已经用条件的第一部分测试了这个代码。它运行良好。如果我有条件的第二部分并且我的type
包含"in"
它没关系,但如果所有三个条件都可用,如果我输入"out"
,如果没有被跳过。为什么呢?
我知道我在 C 方面不是很好,但我认为我可以做到这一点:
if(strlen(type) == 0 || strcmp(type,"in")!=0 || strcmp(type,"out")!=0)
type
作为一个char*
,我已经用条件的第一部分测试了这个代码。它运行良好。如果我有条件的第二部分并且我的type
包含"in"
它没关系,但如果所有三个条件都可用,如果我输入"out"
,如果没有被跳过。为什么呢?
你的代码:
if(strlen(type) == 0 || strcmp(type,"in")!=0 || strcmp(type,"out")!=0){
" your code-1"
}
else{
" your code-2"
}
相当于:
if(strlen(type) == 0 ){
" your code-1"
}
else{
if(strcmp(type,"in")!=0){
" your code-1"
}
else{
if(strcmp(type,"out")!=0){
" your code-1"
}
else{
" your code-2"
}
}
}
关键是如果你首先 if()
执行 if stringtype
有什么东西,那么 else 永远不会执行。因为空字符串(在 else 部分)不能等于"in"
or "out"
。因此,如果字符串不为空,则您始终可以选择执行“code-1” ,如果字符串为空(即 length = 0)则不执行任何操作。
编辑:
我想你想要类似的东西,如果type
字符串是“in”然后执行“code-1”如果类型是“out”然后执行第二个code-2。像:
if(strlen(type) == 0 ){
}
else{
if(strcmp(type,"in")!=0){
" your code-1"
}
else{
if(strcmp(type,"out")!=0){
" your code-2"
}
}
}
你可以这样做:
flag = 'o';// this will save string comparison again
if(strlen(type) == 0 || strcmp(type,"in")==0 ||
strcmp(type,"out")!=0 && !(flag='?')){
"code-1"
}
else{
if(flag=='o'){ //no strcmp needed
"code-2"
}
}
在这里,我根据我的逻辑发布了一个代码,它运行为:
:~$ ./a.out
Enter string: in
in
:~$ ./a.out
Enter string: out
out
:~$ ./a.out
Enter string: xx
:~$
type
如果为空,或者如果type
包含“in”或“out” ,则将采用该分支。
给定表达式a || b
,以下是正确的:
a
先求值;a
计算结果为非零 (true),则整个表达式计算结果为 true,并且b
不计算;a
评估为零(假),则b
评估;a
和都b
计算为零(假),则整个表达式的计算结果为假;否则,表达式的计算结果为真;所以如果type
包含字符串“out”,那么
strlen(type) == 0
评估为false
,意思是我们评估strcmp(type, "in") != 0
, 评估为false
, 意思是我们评估strcmp(type, "out") != 0
,其计算结果为true
,所以根据您所说的预期,听起来您对上次测试的感觉是错误的,并且您确实想要
if( strlen( type ) == 0 ||
strcmp( type, "in" ) != 0 ||
strcmp( type, "out" ) == 0 )
{ // ^^ note operator
...
}
type
如果为空,如果type
包含“in”或type
不包含“out” ,这将进入分支。