Перевод System::String в char*

Категория: C / C++ Комментариев: 2

Возникла задача перевести в .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* — предлагайте.

Автор: Кто-то   @   20 июля 2010 Комментариев: 2
Метки : ,

Поблагодарить автора

Webmoney Z163628999150, R617151845974

Комментариев: 2

Комментарии
Фев 13, 2011
22:03
#1 jQ :

А как преобразовать обратно из char в string?

P.S. Огромное спасибо за статью!

Автор Фев 15, 2011
10:00

Как-то так:

#include iostream

#include string

using namespace std;

const char* a = «Fish»;

int main ()

{

string b;

b = a;

b += string («Spam»);

cout < < b;

}

оставить комментарий

Предыдущая запись
«
Следующая запись
»