Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 托管C++;如何将以非空结尾的常量字符*转换为字符串^_C++_Marshalling_Managed C++ - Fatal编程技术网

C++ 托管C++;如何将以非空结尾的常量字符*转换为字符串^

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

在我的原生+托管代码项目中,我需要将常量char*(不是以null结尾)转换为托管字符串^。当char*正确地以null结尾时,下面的代码运行良好。但是,当char*不是以null结尾时,它返回疯狂的字符串

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的另一个副本。这将是我的最后一个选择。