托管c++如何将非空终止的const char *转换为String ^
Managed C++ how to convert NOT Null terminated const char * to String ^
在我的本机+托管代码项目中,我需要将const char *(非null终止)转换为托管字符串^。当char *正确地以null结尾时,下面的代码运行良好。但是,当char *不是null结束时,它返回疯狂字符串。
String^ STAK::CLRServerProxy::ToCLR(const char* str)
{
return msclr::interop::marshal_as<String^>(str);
}
是否有一种方法可以要求它将这个本机char *仅封送到前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作为第二个参数来调用
我宁愿不创建一个副本
你必须创建一个副本,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;
}
相关文章:
- 在字符串函数中抛出'char const*'实例后调用的终止
- 双重标准?为什么只有 char* const&a = "bla" 的警告?
- 包括"lvtocon.h",未定义对'operator<<(std::ostream&, char const*)的引用
- 为什么 const char* const & = 可以编译"hello"?
- 将字符串文本常量定义为 char const* 和 wchar const*
- 如何将std::wstring转换为char const[]
- "char const * name() const _WEBSOCKETPP_NOEXCEPT_TOKEN_ {"剂量是什么意思
- 使用提升对字符串进行标记化时,将令牌转换为 char* const* 时失败
- 如何从 std::initializer_list<char const* 构建 std::vector<std::string>>
- 将 std::vector<std::string> 转换为 const char* const*
- 引发"char const*"错误的实例后调用的终止
- 将const char * const参数成员分配给新值
- 从'const char**'到'char* const*'的转换无效
- 从 sub_match<常量字符 *>' 转换为'const char *const &'
- char*const和constchar*之间有什么区别?(重复-需要更多澄清)
- 使用工厂方法时编译器错误:无法转换"const std::p air<char* const
- HEVC 解码器端口 Android 警告:从 'signed char*' 到 'char const* 的转换无效*
- 如何从'char const*'中删除常量
- 'char const *str'作为模板参数
- 为什么不;t strlen(.)应为const char*const str,而不是const char*