C++ 托管C++;如何将以非空结尾的常量字符*转换为字符串^
在我的原生+托管代码项目中,我需要将常量char*(不是以null结尾)转换为托管字符串^。当char*正确地以null结尾时,下面的代码运行良好。但是,当char*不是以null结尾时,它返回疯狂的字符串C++ 托管C++;如何将以非空结尾的常量字符*转换为字符串^,c++,marshalling,managed-c++,C++,Marshalling,Managed C++,在我的原生+托管代码项目中,我需要将常量char*(不是以null结尾)转换为托管字符串^。当char*正确地以null结尾时,下面的代码运行良好。但是,当char*不是以null结尾时,它返回疯狂的字符串 String^ STAK::CLRServerProxy::ToCLR(const char* str) { return msclr::interop::marshal_as<String^>(str); } String^STAK::CLRServerPro
String^ STAK::CLRServerProxy::ToCLR(const char* str)
{
return msclr::interop::marshal_as<String^>(str);
}
String^STAK::CLRServerProxy::ToCLR(const char*str)
{
返回msclr::interop::marshal_as(str);
}
有没有办法让它将本机字符*封送到前5个字符?(此本机字符串的长度始终为5个字符)
谢谢,
String^ STAK::CLRServerProxy::ToCLR(const char* str)
{
return Marshal::PtrToStringAnsi((IntPtr) (char *) str, 5)
}
或者如果你想让它更灵活
String^ STAK::CLRServerProxy::ToCLR(const char* str, size_t n)
{
return Marshal::PtrToStringAnsi((IntPtr) (char *) str, n)
}
通过将5作为第二个参数调用
或者如果你想让它更灵活
String^ STAK::CLRServerProxy::ToCLR(const char* str, size_t n)
{
return Marshal::PtrToStringAnsi((IntPtr) (char *) str, n)
}
通过将5作为第二个参数调用
我宁愿不创建副本 您必须创建一个副本,System::String在结构上与const char*非常不同。Marshal类有一个简单的助手方法来进行转换,您可以指定要转换为多少字节,而不需要正确终止的C字符串。示例程序:
#include "stdafx.h"
using namespace System;
using namespace System::Diagnostics;
using namespace System::Runtime::InteropServices;
int main(array<System::String ^> ^args)
{
const char* str = "yada12345garbage...";
String^ s = Marshal::PtrToStringAnsi(IntPtr((void*)&str[4]), 5);
Debug::Assert(s == "12345");
return 0;
}
#包括“stdafx.h”
使用名称空间系统;
使用名称空间系统::诊断;
使用名称空间System::Runtime::InteropServices;
int main(数组^args)
{
const char*str=“yada12345垃圾…”;
字符串^s=Marshal::PtrToStringAnsi(IntPtr((void*)和str[4]),5);
调试::断言(s==“12345”);
返回0;
}
我宁愿不创建副本 您必须创建一个副本,System::String在结构上与const char*非常不同。Marshal类有一个简单的助手方法来进行转换,您可以指定要转换为多少字节,而不需要正确终止的C字符串。示例程序:
#include "stdafx.h"
using namespace System;
using namespace System::Diagnostics;
using namespace System::Runtime::InteropServices;
int main(array<System::String ^> ^args)
{
const char* str = "yada12345garbage...";
String^ s = Marshal::PtrToStringAnsi(IntPtr((void*)&str[4]), 5);
Debug::Assert(s == "12345");
return 0;
}
#包括“stdafx.h”
使用名称空间系统;
使用名称空间系统::诊断;
使用名称空间System::Runtime::InteropServices;
int main(数组^args)
{
const char*str=“yada12345垃圾…”;
字符串^s=Marshal::PtrToStringAnsi(IntPtr((void*)和str[4]),5);
调试::断言(s==“12345”);
返回0;
}
将源字符串更改为char source[6],并在源代码[5]处设置一个零@Dieter我无法更改源代码。这是从第三方服务器发送的。如果有字符缓冲区[6],strncpy和缓冲区[5]=0,我不希望创建副本。请将源字符串更改为字符源[6],并在源[5]处设置零@Dieter我无法更改源。这是从第三方服务器发送的。如果有字符缓冲区[6],strncpy和缓冲区[5]=0,我不希望创建副本。我正在尝试避免创建str的另一个副本。这将是我的最后一个选择。我正在尝试避免创建str的另一个副本。这将是我的最后一个选择。