C ++ / CLI从System :: String ^转换为std :: string

有人可以发表一个简单的代码,将转换,

System::String^ 

至,

C ++ std::string

即,我只是想分配的价值,

 String^ originalString; 

至,

 std::string newString; 

检查出System::Runtime::InteropServices::Marshal::StringToCoTaskMemUni()及其朋友。

对不起,现在不能发布代码; 我没有在这台机器上的VS来检查它发布之前编译。

不要推出自己的,使用微软提供的这些方便(可扩展)的包装。

例如:

 #include <msclr\marshal_cppstd.h> System::String^ managed = "test"; std::string unmanaged = msclr::interop::marshal_as<std::string>(managed); 

你可以很容易地做到这一点如下

 #include <msclr/marshal_cppstd.h> System::String^ xyz="Hi boys"; std::string converted_xyz=msclr::interop::marshal_as< std::string >( xyz); 

这对我工作:

 #include <stdlib.h> #include <string.h> #include <msclr\marshal_cppstd.h> //.. using namespace msclr::interop; //.. System::String^ clrString = (TextoDeBoton); std::string stdString = marshal_as<std::string>(clrString); //String^ to std //System::String^ myString = marshal_as<System::String^>(MyBasicStirng); //std to String^ prueba.CopyInfo(stdString); //MyMethod //.. //Where: String^ = TextoDeBoton; //and stdString is a "normal" string; 

这里有一些很多年前为c ++ / cli项目编写的转换例程,它们仍然可以工作。

 void StringToStlWString ( System::String const^ s, std::wstring& os) { String^ string = const_cast<String^>(s); const wchar_t* chars = reinterpret_cast<const wchar_t*>((Marshal::StringToHGlobalUni(string)).ToPointer()); os = chars; Marshal::FreeHGlobal(IntPtr((void*)chars)); } System::String^ StlWStringToString (std::wstring const& os) { String^ str = gcnew String(os.c_str()); //String^ str = gcnew String(""); return str; } System::String^ WPtrToString(wchar_t const* pData, int length) { if (length == 0) { //use null termination length = wcslen(pData); if (length == 0) { System::String^ ret = ""; return ret; } } System::IntPtr bfr = System::IntPtr(const_cast<wchar_t*>(pData)); System::String^ ret = System::Runtime::InteropServices::Marshal::PtrToStringUni(bfr, length); return ret; } void Utf8ToStlWString(char const* pUtfString, std::wstring& stlString) { //wchar_t* pString; MAKE_WIDEPTR_FROMUTF8(pString, pUtfString); stlString = pString; } void Utf8ToStlWStringN(char const* pUtfString, std::wstring& stlString, ULONG length) { //wchar_t* pString; MAKE_WIDEPTR_FROMUTF8N(pString, pUtfString, length); stlString = pString; } 

我花了几个小时试图将Windows窗体列表框ToString值转换为标准string,以便我可以使用它与fstream输出到一个txt文件。 我的Visual Studio没有与元帅头文件,我发现几个答案使用。 经过这么多的试验和错误,我终于find了一个解决scheme,只是使用System :: Runtime :: InteropServices的问题:

 void MarshalString ( String ^ s, string& os ) { using namespace Runtime::InteropServices; const char* chars = (const char*)(Marshal::StringToHGlobalAnsi(s)).ToPointer(); os = chars; Marshal::FreeHGlobal(IntPtr((void*)chars)); } //this is the code to use the function: scheduleBox->SetSelected(0,true); string a = "test"; String ^ c = gcnew String(scheduleBox->SelectedItem->ToString()); MarshalString(c, a); filestream << a; 

这里是MSDN页面的例子: http : //msdn.microsoft.com/en-us/library/1b4az623(v=vs.80).aspx

我知道这是一个非常简单的解决scheme,但是这花了我几个小时的疑难解答,并访问几个论坛终于find了一些工作。

我发现一个简单的方法来从一个string得到一个std :: string是使用sprintf()。

 char cStr[50] = { 0 }; String^ clrString = "Hello"; if (clrString->Length < sizeof(cStr)) sprintf(cStr, "%s", clrString); std::string stlString(cStr); 

不需要调用统帅function!

更新感谢埃里克,我已经修改了示例代码来检查inputstring的大小,以防止缓冲区溢出。

我喜欢远离编组。

 Using CString newString(originalString); 

对我来说似乎更干净更快。 无需担心创build和删除上下文。

//我用VS2012写下面的代码 – convert_system_string到Standard_Sting

  #include "stdafx.h" #include <iostream> #include <string> using namespace System; using namespace Runtime::InteropServices; void MarshalString ( String^ s, std::string& outputstring ) { const char* kPtoC = (const char*) (Marshal::StringToHGlobalAnsi(s)).ToPointer(); outputstring = kPtoC; Marshal::FreeHGlobal(IntPtr((void*)kPtoC)); } int _tmain(int argc, _TCHAR* argv[]) { std::string strNativeString; String ^ strManagedString = "Temp"; MarshalString(strManagedString, strNativeString); std::cout << strNativeString << std::endl; return 0; }