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を返します。これを行う必要があります...01 or -11 or -1||0
if(strcmp(ent->d_name, dot) == 0 || strcmp(ent->d_name, twoDots) == 0)
== 0strcmpごとに追加しました
strcmp自体はブール値を返しません。代わりに、intを返します。一致する場合は0、一致しない場合はその他。したがって、これは役立つはずです:
if(0 == strcmp(d_name, dot) || 0 == strcmp(d_name, twoDots)) {
// Other code here
}