На этом шаге мы приведем программу, реализующую указанное преобразование.
Метод PtrToStringChars() из vcclr.h можно использовать для преобразования строки System:: String в native-строку типа wchar_t* или char*.
Метод возвращает указатель на Юникод-строку, т. к. строки CLR - это строки Юникода. Затем, как показано в примере, вы можете конвертировать "широкую" строку в обычную.
Текст программы приведен ниже, а результат.- на рисунке 1.
// 220_1.cpp: главный файл проекта. #include "stdafx.h" #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <vcclr.h> //for PtrTostringChars() using namespace System; void main() { String^ str = "Hello from our friends!"; // Преобразование String-строки в тип wchar_t в управляемой куче // и формирование pin-указателя на новую строку (указателя-фиксатора) // чтобы строка не переместилась в куче, пока будет идти // вызов native-функции printf(): pin_ptr<const wchar_t> wch = PtrToStringChars(str); printf_s("%S\n", wch); // преобразование к типу char*: // можно сразу перевести wchar_t* в char*, используя одну // из функций-преобразователей WideCharToMultiByte() и wcstombs_s(): size_t convertedChars = 0; size_t sizeInBytes = ((str->Length + 1) * 2); errno_t err = 0; // выделение памяти в неуправляемой куче // под размер managed-строки; // ch будет на нее указывать: char *ch = new char [sizeInBytes]; err = wcstombs_s(&convertedChars, // кол-во преобразованных символов ch, // адрес, с которого они будут записываться sizeInBytes, // размер буфера ch wch, // адрес исходной строки sizeInBytes); // максимальное количество переписываемых байтов if (err != 0) printf_s("wcstombs_s failed!\n"); printf_s("%s\n", ch); //вывод переписанной строки delete [] ch; _getch(); }
Рис.1. Результат преобразования System::String-строки в wchar_t* и char*
На следующем шаге мы рассмотрим преобразование String-строки в string-строку.