दिलचस्प पोस्ट
पीडीओ तैयार बयान – पैरामीटर के नामों में बृहदान्त्र के लिए क्या प्रयोग किया जाता है? जावा में BufferedImage अल्फा मुखौटा सेट करें मोंगोडीबी के साथ लोचदार खोज का उपयोग कैसे करें? एक संकेतक "dereferencing" क्या मतलब है? UIWebView कैश कैसे साफ़ करें? क्या एक JSESSIONID बनाया शर्तों के तहत? SQL में TRUNCATE और DELETE के बीच अंतर क्या है घोषित करने वाले संकेतक; प्रकार और नाम के बीच अंतरिक्ष के बाईं या दाईं तरफ तारांकन? मुझे OSV पर JAVA_HOME को क्या सेट करना चाहिए? रिफ्लेक्शन के माध्यम से एक वर्ग से फ़ील्ड में दूसरे मूल्यों को कॉपी करें असिंक्रोनस बनाम मल्टीथ्रेडिंग – क्या कोई अंतर है? रूबी में इन ब्लॉकों कोडिंग शैलियों के अंतर या मान क्या हैं? @ एचटीएमएल। डिस्प्लेफ़ॉर – डेटफॉर्मेट ("एमएम / डीडी / य्याय") एचटीएमएल पेज में सर्कल कैसे बनाएं? पायथन सूची भ्रम

सी ++ / सीएलआई सिस्टम से परिवर्तित :: स्ट्रिंग ^ से std :: string

क्या कोई एक साधारण कोड पोस्ट कर सकता है जो कन्वर्ट होगा,

System::String^ 

सेवा मेरे

C ++ std::string

यानी, मैं बस के मान निर्दिष्ट करना चाहता हूँ,

 String^ originalString; 

सेवा मेरे

 std::string newString; 

वेब के समाधान से एकत्रित समाधान "सी ++ / सीएलआई सिस्टम से परिवर्तित :: स्ट्रिंग ^ से std :: string"

System::Runtime::InteropServices::Marshal::StringToCoTaskMemUni() और उसके मित्र देखें।

क्षमा करें अब कोड पोस्ट नहीं कर सकता; मेरे पास इस मशीन पर पोस्ट करने से पहले इसे संकलित करने के लिए वीएस नहीं है।

अपना स्वयं का रोल न करें, माइक्रोसॉफ्ट द्वारा प्रदान किए गए ये आसान (और एक्स्टेंसिबल) रैपर का उपयोग करें

उदाहरण के लिए:

 #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; 

यहां कुछ रूपांतरण पद्धतियां हैं जो मैंने कई साल पहले सी ++ / क्ली प्रोजेक्ट के लिए लिखी हैं, उन्हें अभी भी काम करना चाहिए

 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; } 

मैं एक मानक स्ट्रिंग में एक विंडो प्रपत्र सूचीबॉक्स टूस्ट्रिंग मान को कनवर्ट करने के लिए घंटों में बिताया ताकि मैं इसे fstream के साथ आउटपुट के लिए एक txt फ़ाइल में इस्तेमाल कर सकूं। मेरा विजुअल स्टूडियो मार्शल हेडर फाइलों के साथ नहीं आया था, जो मैंने पाया कि कई उत्तरों का उपयोग करने के लिए कहा गया था। इतना परीक्षण और त्रुटि के बाद मुझे अंततः इस समस्या का एक समाधान मिला जो बस सिस्टम :: रनटाइम :: इंटरऑप सेवा का उपयोग करता है:

 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; 

और यहां उदाहरण के साथ एमएसडीएन पृष्ठ है: http://msdn.microsoft.com/en-us/library/1b4az623(v=vs.80).aspx

मुझे पता है कि यह एक बहुत आसान समाधान है, लेकिन यह मुझे समस्या निवारण के घंटे और कई मंचों का दौरा करने के लिए अंत में कुछ काम किया जो मिल गया

स्ट्रिंग :: स्ट्रिंग से स्प्रिंटफ़ () का उपयोग करने के लिए मुझे एक आसान तरीका मिला है

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

मार्शल कार्यों को कॉल करने की आवश्यकता नहीं है!

अपडेट एरिक को धन्यवाद, मैंने बफर ओवरफ्लो को रोकने के लिए इनपुट स्ट्रिंग के आकार की जांच के लिए नमूना कोड को संशोधित किया है।

मुझे मार्शलर से दूर रहना पसंद है

 Using CString newString(originalString); 

मेरे लिए बहुत क्लीनर और तेज लगता है किसी संदर्भ को बनाने और हटाने के बारे में चिंता करने की आवश्यकता नहीं है

// मैं कोड के नीचे लिखने के लिए वीएस2012 का प्रयोग किया- कन्वर्ट_सिस्टम_स्ट्रिंग को स्टैंडर्ड लैटिंग में

  #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; }