0

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間違って使用していますか?

4

5 に答える 5

10

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)
于 2012-08-17T21:08:23.960 に答える
7

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
于 2012-08-17T21:08:15.473 に答える
3

strcmp文字列が辞書式順序で前、等しい、または後の場合、それぞれ-1、0、または1を返します。

文字列が等しいかどうかを確認するには、を使用しますstrcmp(s1, s2) == 0

于 2012-08-17T21:08:25.183 に答える
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ごとに追加しました

于 2012-08-17T21:15:47.470 に答える
0

strcmp自体はブール値を返しません。代わりに、intを返します。一致する場合は0、一致しない場合はその他。したがって、これは役立つはずです:

if(0 == strcmp(d_name, dot) || 0 == strcmp(d_name, twoDots)) {
    // Other code here
}
于 2019-01-18T14:05:17.517 に答える