none
Stringコンストラクタの挙動差 RRS feed

  • 質問

  • 原因はわかったのですが、一貫性がない(バグ?)ように思います。
    こういう挙動をさせる理由があるのでしょうか?

    以下のコードを実行した時、最後のifは偽になります。
    AとBは長さが違い、配列化したものを見ると、Bには最後にNULL文字がありません。
    変換した際に削っているんだと思いますが、それなら何故Aの方は削らないのか。。。

        char    caA[ 4 ];
        int    iA;
        int    iB;
        array<wchar_t>^    aB;
        array<wchar_t>^    aA_;
        array<wchar_t>^    aB_;
        String^    A;
        String^    B;

        strcpy_s( caA, sizeof caA, "abc" );
        A = gcnew String( caA );
        aB = gcnew array<wchar_t>( 4 );
        aB[ 0 ] = 'a';
        aB[ 1 ] = 'b';
        aB[ 2 ] = 'c';
        aB[ 3 ] = 0;
        B = gcnew String( aB );
        //
        if ( A == B ){
            //
        }
        else{
            //
            iA = A->Length;
            iB = B->Length;
            aA_ = A->ToCharArray();
            aB_ = B->ToCharArray();
        }
    2010年10月15日 12:07

回答

  • System::String は、C++ が一般に扱う文字列とは異なり NULL 文字を文字列中に含むことができます。

    さて、String(array<wchar_t>) と String(char*) の動作差ですが、前者はマネージ配列、後者はアンマネージポインタです。

    マネージ配列はそれ自身が長さ情報を持っています。つまり、何文字の String^ にするかは明らかなので、途中に NULL 文字があってもそのまま変換します。

    翻ってアンマネージポインタの場合、長さの情報がありません。ですので、NULL 文字が見つかるまで文字列に変換します。

    • 回答としてマーク K6963 2010年10月15日 12:37
    2010年10月15日 12:13

すべての返信

  • System::String は、C++ が一般に扱う文字列とは異なり NULL 文字を文字列中に含むことができます。

    さて、String(array<wchar_t>) と String(char*) の動作差ですが、前者はマネージ配列、後者はアンマネージポインタです。

    マネージ配列はそれ自身が長さ情報を持っています。つまり、何文字の String^ にするかは明らかなので、途中に NULL 文字があってもそのまま変換します。

    翻ってアンマネージポインタの場合、長さの情報がありません。ですので、NULL 文字が見つかるまで文字列に変換します。

    • 回答としてマーク K6963 2010年10月15日 12:37
    2010年10月15日 12:13
  • レスありがとです。

    確かに、アンマネージは、「どこまで」をNULLに頼るしかないですね。

    そしてそれは、変換対象のデータではなく、印としてしか扱われないということか。

    あと、質問の文章が逆でした。

    NULLがないのはAの方でした(^^;;;

     

    2010年10月15日 12:36