На самом деле, я нашел самый простой способ получить char *
от String^
- это использовать доброе старое sprintf()
. Так что в вашем случае вы можете просто сделать это:
char cNow[17] = { 0 };
String^ nowString = DateTime::Now.ToString("yyyy-MM-dd-HH:mm");
if (nowString->Length < sizeof(cNow)) // make sure it fits & allow space for null terminator
sprintf(cNow, "%s", nowString);
Нет необходимости вызывать функции Marshal
!
Обновление
Похоже, что VS 2015 более тесно соответствует стандартам C ++ 11, поэтому использование sprintf()
с .NET String не будет работать. Самый простой способ - использовать функцию marshal_as()
следующим образом:
Включите эти строки перед вашим кодом:
#include <msclr/marshal_cppstd.h>
using namespace msclr::interop;
Тогда это должно работать:
char cNow[17] = { 0 };
String^ nowString = DateTime::Now.ToString("yyyy-MM-dd-HH:mm");
string sNow = marshal_as<string>(nowString);
if (sNow.length() < sizeof(cNow)) // make sure it fits & allow space for null terminator
sprintf(cNow, "%s", sNow.c_str());
В противном случае, если вы не хотите использовать функцию marshal_as()
, вы можете скопировать строковый символ за символом, например так:
char cNow[17] = { 0 };
String^ nowString = DateTime::Now.ToString("yyyy-MM-dd-HH:mm");
if (nowString->Length < sizeof(cNow)) // make sure it fits & allow space for null terminator
{
for (int i = 0; i < nowString->Length; i++)
cNow[i] = static_cast<char>(nowString[i]);
}