ユーザ用ツール

サイト用ツール


clr:文字列

差分

この文書の現在のバージョンと選択したバージョンの差分を表示します。

この比較画面にリンクする

clr:文字列 [2009/02/03 07:44]
admin 作成
clr:文字列 [2013/12/23 09:08]
ライン 1: ライン 1:
-====== 文字列 ====== 
  
- 
-C++/​CLIの文字列操作は、System::​Stringを使います。ソースコード中のリテラル文字列は、必要に応じてString^に格上げされます。内部的にはwchar_t(UTF-16)で値を保持しています。 
- 
-===== char*やwchar_t*からString^への変換 ===== 
- 
-<code cpp> 
-const char* p = "​AAA";​ 
-String^ s = gcnew String(p); 
-</​code>​ 
-でできます。 
- 
-===== String^からwchar_t*への変換 ===== 
- 
-<code cpp> 
-#include <​vcclr.h>​ 
- 
-String^ s = L"​AAA";​ 
-pin_ptr<​const wchar_t> pIn = PtrToStringChars(s);​ 
-</​code>​ 
- 
-==== String^からchar*への変換 ==== 
-String^はユニコードなので変換の際には注意が必要。 
- 
-=== StringToHGlobalAnsiを使う === 
-<code cpp> 
-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; 
-} 
-</​code>​ 
- 
-=== wcstombs_sを使う。locale依存 === 
-<code cpp> 
-std::string getStdString(String^ s) 
-{ 
- std::​string ret; 
- if ( s == nullptr ) 
- return ret; 
- 
- pin_ptr<​const wchar_t> p = PtrToStringChars(s);​ 
- size_t len = (s->​Length+1) * sizeof(wchar_t);​ 
- char* pT = (char*)malloc(len);​ 
- size_t retutrnvalue;​ 
- 
- if ( 0 != wcstombs_s( &​retutrnvalue, ​ 
- pT, 
- len, 
- p, 
- len ) ) 
- { 
- free(pT); 
- return ret; 
- } 
- ret = pT; 
- free(pT); 
- return ret; 
-} 
-</​code>​ 
- 
-Stringの基本事項として、一度設定したら内部の文字列は変化しない(内部の文字列を変更するメソッドはない)があります。これによってあるString^ハンドルによる操作で、たのString^ハンドルの文字列が変化することを心配する必要がなくなります。 
- 
-また、Stringに対してで暗黙のCLRサポートがあります。 
- 
-  - ==で比較すると、ハンドルの比較ではなくて文字列の比較が行われる。!=も同様 
-  - +で色々な型を足すことができる。 
- 
-これら関してはC++との互換性で影響が出ることがあります。 
- 
-以下のC++コードはC++/​CLIだとコンパイルエラーになります。 
-<code cpp> 
-#include "​stdio.h"​ 
-int main(int argc, char* argv[]) 
-{ 
- const char* p = "​ABC"​ + 1; 
- ​printf(p);​ 
- ​return 0; 
-} 
-</​code>​ 
- 
-===== 空文字の扱い ===== 
- 
- 
-空文字を扱うための仕組みもあるので""​やL""​よりもこちらを使うほうがいいかもしれません。 
-<code cpp> 
-if ( s == nullptr || s->​Length == 0 ) 
-    return; 
-</​code>​ 
-の代わりに 
-<code cpp> 
-if ( String::​IsNullOrEmpty(s) ) 
-    return; 
-</​code>​ 
-  
- 
-同様に 
-<code cpp> 
-    return L"";​ 
-</​code>​ 
-の代わりに 
-<code cpp> 
-    return String::​Empty;​ 
-</​code>​ 



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