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
間違って使用していますか?
strcmp()
0
文字列が等しく、文字列をとの両方"."
にすることはできない場合に戻ります".."
。つまり、の片側は||
常にゼロ以外であるため、条件は常に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)
strcmp()
差がある場合はゼロ以外を返します(したがって、と評価されtrue
ます)。
ドキュメント(以下のリンク)もご覧ください。また、このようなタスクstd::string
を提供するものも見てください。方法については、この回答をoperator==()
参照してください。
文字列間の関係を示す整数値を返します。ゼロ値は、両方の文字列が等しいことを示します。ゼロより大きい値は、一致しない最初の文字の値がstr2よりもstr1の方が大きいことを示します。また、ゼロ未満の値はその逆を示します。
これらの各関数の戻り値は、string1とstring2の辞書式関係を示します。
Value Relationship of string1 to string2
< 0 string1 less than string2
0 string1 identical to string2
> 0 string1 greater than string2
strcmp
文字列が辞書式順序で前、等しい、または後の場合、それぞれ-1、0、または1を返します。
文字列が等しいかどうかを確認するには、を使用しますstrcmp(s1, s2) == 0
。
等しい場合と異なる場合にstrcmp
戻るため、2つのstrcmpの少なくとも1つが返されます。いずれかの条件が異なる場合、はtrueを返します。これを行う必要があります...0
1 or -1
1 or -1
||
0
if(strcmp(ent->d_name, dot) == 0 || strcmp(ent->d_name, twoDots) == 0)
== 0
strcmpごとに追加しました
strcmp自体はブール値を返しません。代わりに、intを返します。一致する場合は0、一致しない場合はその他。したがって、これは役立つはずです:
if(0 == strcmp(d_name, dot) || 0 == strcmp(d_name, twoDots)) {
// Other code here
}