2016-11-03 10 views
0

POSIXシステム上のファイルパスを表す文字列に '..'が存在するかどうかを検索しようとしています。私はstd :: string.find( "..")を使用していますが、正しいインデックスを見つけているようですが、ブール式で正しく評価されていません。例えばC++ std :: string.findは未処理の結果をブール式で返します

#include <string> 
#include <stdio.h> 


int main(int argc, char *argv[]) { 
    std::string a = "abcd"; 

    int apos = a.find(".."); 

    bool test1 = a.find("..") >= 0; 
    bool test2 = apos >= 0; 

    if (test1) { 
    printf("TEST1 FAILED: %ld >= 0!\n", a.find("..")); 
    } 
    if (test2) { 
    printf("TEST2 FAILED %d >= 0!\n", apos); 
    } 
} 

出力:

$ g++ test.cpp -o test 
$ ./test 
TEST1 FAILED: -1 >= 0! 
$ 

なぜa.find("..")ブール式に-1に評価されていない任意のアイデア?

+0

より多くのコンパイラの警告を有効にします。具体的には、 'error:unsigned expression> = 0の比較は常に真です[-Werror = type-limits]'に興味があります。 – Biffen

+1

'std :: find'の戻り値の型は符号なし整数であるため、負ではありません。 See [string.find()は、== - 1が使用されている場合はtrueを返しますが、<0が使用されている場合はfalseを返します(http://stackoverflow.com/a/40392882/3309790) – songyuanyao

答えて

1

これは今日尋ねられました。それは0よりも大きくなるように、それはタイプだがunsigned intあるfind戻りnposが、それは-1を使用して初期化されているためです

は、unsigned intです。

あなたはfindの結果をnposではなく、-1と比較してください。

関連する問題