ユーザ用ツール

サイト用ツール


C++/CLI

CLR

実用編

その他

文字列

以前のリビジョンの文書です


文字列

C++/CLIの文字列操作は、System::Stringを使います。

ソースコード中のリテラル文字列は、必要に応じてString^に格上げされます。

内部的にはwchar_t(UTF-16)で値を保持しています。

char*やwchar_t*からStringへの変換は

const char* p = "AAA";
String^ s = gcnew String(p);

でできます。

逆の変換は

1、const wchar_t*がほしい場合は

#include <vcclr.h>
 
String^ s = L"AAA";
pin_ptr<const wchar_t> pIn = PtrToStringChars(s);

2、コピーがほしい場合は

StringToHGlobalAnsiまたはStringToHGlobalUniを使います。

std::string getStdString(String^ s)
{
 std::string ret;
 System::IntPtr pp = System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(s);
 ret = (const char*)pp.ToPointer() ;
 System::Runtime::InteropServices::Marshal::FreeHGlobal(pp);
 return ret;
}
 
std::wstring getStdWstring(String^ s)
{
 std::wstring ret;
 System::IntPtr pp =  System::Runtime::InteropServices::Marshal::StringToHGlobalUni(s);
 ret = (const wchar_t*)pp.ToPointer() ;
 System::Runtime::InteropServices::Marshal::FreeHGlobal(pp);
 return ret;
 
}

Ansiに変換すると情報が劣化する場合があるので注意が必要です。

Stringの基本事項として、一度設定したら内部の文字列は変化しない(内部の文字列を変更するメソッドはない)があります。

また、Stringに対してで暗黙のCLRサポートがあります。

  1. ==で比較すると、ハンドルの比較ではなくて文字列の比較が行われる。!=も同様
  2. +で色々な型を足すことができる。

これら関してはC++との互換性で影響が出ることがあります。

以下のC++コードはC++/CLIだとコンパイルエラーになります。

#include "stdio.h"
int main(int argc, char* argv[])
{
 const char* p = "ABC" + 1;
 printf(p);
 return 0;
}

空文字の扱い

空文字を扱うための仕組みもあるので““やL”“よりもこちらを使うほうがいいかもしれません。

if ( s == nullptr || s->Length == 0 )
    return;

の代わりに

if ( String::IsNullOrEmpty(s) )
    return;

同様に

    return L"";

の代わりに

    return String::Empty;



/var/www/html/virtual/cppcli/data/attic/文字列.1233383440.txt.gz · 最終更新: 2013/12/23 09:07 (外部編集)