• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:System::String->char*変換でき)

C++/CLIでSystem::String^文字列をchar*に変換する関数の改良方法

このQ&Aのポイント
  • C++/CLIでSystem::String^文字列をchar*に変換する関数を改良する方法について解説します。
  • 現在の関数では256文字以上の文字列を変換する際に問題が発生しています。改良することでこの制限を解決できます。
  • 提供された関数を改良し、256文字以上の文字列を正しく変換できるようにする方法を紹介します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

L"..." はワイド文字列(Unicode) marshalライブラリの使い方は参考URLに。

参考URL:
http://codezine.jp/article/detail/4774
sumire_kanou
質問者

お礼

何度もありがとうございます。 これまで文字列の中身をVSのテキストビジュアライザで確認していました。String^の内容をそれで確認すると、256文字以上表示されていたのですが、char*の中身を表示してみると255文字以下に切り捨てられていました。そこで、もしやと思いchar*の中身をstdoutに吐いてみると、256文字以上表示されていました。どうも文字列サイズを持っていないchar*を表示する際に、暗黙下に255文字+\0に丸めているようです…。ちょっと調べてもそのような仕様は見つかりませんでしたが、「安全の為」と言いつつ、勝手に誤解を招く挙動を平気でやってくれるのはいつものことですし、きっとそういう仕様なんでしょう。 お騒がせして申し訳ありません。また少し、マイクロソフトが嫌いになれました。

その他の回答 (1)

回答No.1

↓問題ないっすねー (VC++10) #include <iostream> #include <msclr/marshal.h> using namespace msclr::interop; using namespace std; using namespace System; int main() { String^ input = L""; for ( int i = 0; i < 100; ++i ) { input = input + L"0123456789"; } marshal_context ctx; // キモはココと const char* result = ctx.marshal_as<const char*>(input); // ココだけ cout << result << endl; }

sumire_kanou
質問者

補足

ありがとうございます。C++/CLI初心者の為、L"~"が理解できていないですが、文字列の型指定子みたいなものでしょうか? あと、私が提示しましたコードのようにString^として受け取り(L""を結合して生成しない)char*として返す(標準出力に吐かない)関数は、そちらでもちゃんと動作していますでしょうか?書き忘れてしまいましたが、当方VC++2008です。 C#アプリとアンマネージドC++DLLのラッパDLL(C++/CLI)として、文字列変換が必要になっています。この関数に入った時点ではTextはちゃんと256文字以上なので、DLL間で欠落していないと思いますが…