为什么if语句总是正确的?
char dot[] = ".";
char twoDots[] = "..";
cout << "d_name is " << ent->d_name << endl;
if(strcmp(ent->d_name, dot) || strcmp(ent->d_name, twoDots))
我使用strcmp
错了吗?
答案 0 :(得分:10)
0
和"."
时, strcmp()
会返回".."
。意味着||
的一侧始终为非零,因此条件始终为true
。
要更正:
if(0 == strcmp(ent->d_name, dot) || 0 == strcmp(ent->d_name, twoDots))
另一种方法是使用std::string
存储点变量并使用==
:
#include <string>
const std::string dot(".");
const std::string twoDots("..");
if (ent->d_name == dot || ent->d_name == twoDots)
答案 1 :(得分:7)
strcmp()
将返回非零值(因此评估为true
)。
另请查看文档(下面的链接)。另请查看std::string
,为此类任务提供operator==()
。有关 的方式,请参阅this answer。
返回一个表示字符串之间关系的整数值: 零值表示两个字符串相等。 大于零的值表示不匹配的第一个字符在str1中的值大于在str2中的值;小于零的值表示相反。
每个函数的返回值表示string1与string2的字典关系。
Value Relationship of string1 to string2
< 0 string1 less than string2
0 string1 identical to string2
> 0 string1 greater than string2
答案 2 :(得分:3)
strcmp
返回-1,0或1。
要检查字符串是否相等,请使用strcmp(s1, s2) == 0
。
答案 3 :(得分:0)
由于strcmp
在相等时返回0
而在1 or -1
不同时返回,因此两个strcmp中至少有一个返回1 or -1
,||
将返回true当任何条件与0
不同时,你应该这样做......
if(strcmp(ent->d_name, dot) == 0 || strcmp(ent->d_name, twoDots) == 0)
我在每次strcmp后添加了== 0
答案 4 :(得分:0)
strcmp本身不返回布尔值。而是返回一个int。如果匹配则为0,否则为其他。因此,这应该有所帮助:
if(0 == strcmp(d_name, dot) || 0 == strcmp(d_name, twoDots)) {
// Other code here
}