Возникла задача перевести в .Net-приложении строку из типа String в родной C-шный char*.
У std::string для этих целей есть метод c_str (), поэтому проблем с ним не возникает. Но System::String подобных методов не имеет, что усложняет задачу.
Походив по интернету нашел несколько вариантов решения этой проблемы.
1. Функция PtrToSringChars
#include <vcclr.h> System::String * str = S"Hello world\n"; const __wchar_t __pin * str = PtrToStringChars(str); wprintf(str);
Недостаток — возвращается не чистый char, а const __wchar_t __pin. Хотя это наверное легко решается простым кастованием.
2. Функция StringToHGlobalAnsi
using namespace System::Runtime::InteropServices; System::String * str = S"Hello world\n"; char* str = (char*)(void*)Marshal::StringToHGlobalAnsi(str); printf(str); Marshal::FreeHGlobal(str);
Недостаток — возвращается строка в ANSI, что будет со строкой в UTF-8 — неизвестно.
3. Использование в качестве посредника CString
#include <atlstr.h> System::String * str = S"Hello world\n"; CString str2(str); char* buf = str2.GetBuffer(0); printf(buf);
Недостаток — необходимо подключать к проекту поддержку ATL.
4. Маршалинг
#include <msclr/marshal.h> using namespace msclr::interop; marshal_context ^ context = gcnew marshal_context(); const char* str2 = context->marshal_as<const char*>(str); puts(str2); delete context;
Недостаток — не работает с Visual C++ 2003.
5. Посимвольное копирование
System::String* temp = new System::String("Hello World!");
char* myString = new char[temp->Length];
for(int i = 0; i < temp->Length; i++)
myString[i] = temp-<get_Chars(i);
Недостаток — не элегантно.
6. Перекодирование в необходимую кодировку
String * s = "Hello World!"; char utf8 __gc[] = Encoding::UTF8->GetBytes(s); char __pin * value = &utf8[0];
Для меня самым подходящим оказался вариант №2.
Если кто-то знает еще методы перевода из System::String в char* — предлагайте.
А как преобразовать обратно из char в string?
P.S. Огромное спасибо за статью!
Как-то так:
#include iostream
#include string
using namespace std;
const char* a = «Fish»;
int main ()
{
string b;
b = a;
b += string («Spam»);
cout < < b;
}