2012-02-09 16 views
0

私はstd::stringで作業することを好むが、ここで何がうまくいかないのか理解したい。std :: type T **とT * [N]の検索

T**のポインタ演算が正しく機能していても、std::findが正しく動作しない理由を理解できません。同様に -

std::cout << *(argv+1) << "\t" <<*(argv+2) << std::endl; 

の場合は問題ありません。渡さ

#include <iostream> 
#include <algorithm> 

int main(int argc, const char ** argv) 
{ 
    std::cout << *(argv+1) << "\t" <<*(argv+2) << std::endl; 

    const char ** cmdPtr = std::find(argv+1, argv+argc, "Hello") ; 

    const char * testAr[] = { "Hello", "World" }; 
    const char ** testPtr = std::find(testAr, testAr+2, "Hello"); 

    if(cmdPtr == argv+argc) 
     std::cout << "String not found" << std::endl; 

    if(testPtr != testAr+2) 
     std::cout << "String found: " << *testPtr << std::endl; 

    return 0; 
} 

引数:Hello Worldの

出力:こんにちは

ありがとう:

のHello World

文字列を見つけていない文字列。

答えて

1

char const*のタイプを比較すると、アドレスを指すことになります。 "Hello"のアドレスは、文字列リテラル"Hello"の別のアドレスと比較しない限り、異なることが保証されています(この場合、ポインタと等価です)。 compare()関数は、指し示されている文字を比較します。

+0

正しい結果が得られます。 – Mahesh

+0

文字列リテラルが同じアドレスを取得する保証はありません。彼らはそうしてもいなくてもよい。一部のコンパイラでは、翻訳単位で文字列リテラルを共有することは非常に徹底していますが、そうでないものもあります。 –

1

最初のケースでは、ポインターの値を比較していますが、ポインターの値は比較していません。そして、定数 "Hello"は、最初の要素と同じアドレスをargvに持っていません。

は、使用してみてください:

const char ** cmdPtr = std::find(argv+1, argv+argc, std::string("Hello")) ; 

std::stringは内容ではなくアドレスを比較するために知っています。

コンパイラでは、すべてのリテラルを1つにまとめることができるため、コード全体で「Hello」が表示されるたびに、実際には同じポインタになります。したがって、

const char * testAr[] = { "Hello", "World" }; 
const char ** testPtr = std::find(testAr, testAr+2, "Hello"); 

における平等のために比較することは、あなたが今、第二のケースをチェックすることができ

+0

しかし、なぜそれがポインタ型の文字配列のために働いているのですか? – Mahesh

+1

コンパイラはおそらく、すべての同一のリテラルを単一のものに折り畳むためです。だからあなたのコードにあるすべての "Hello"リテラルは実際には同じポインタです – Pablo

関連する問題