将std :: string深度复制到char *的正确方法

时间:2014-07-14 07:00:07

标签: c++ string dll

我应该使用哪种解决方案将std :: string的某些内容深层复制到C ++中的dll边界的char *上?

  • memcpy(szValue, value.c_str(), value.size())

  • strncpy_s(szValue, strlen(szValue), value.c_str(), value.length())

dll中从外部调用的方法:

unsigned int Interface::GetProp(const char* const szName, char* szValue)
{
    // ...

}

我也尝试过:

std::string value = m_xmlParser.GetNodeValue(propName);
std::vector<char> propValue(value.begin(), value.end());
propValue.push_back('\0');
szValue = &propValue[0];

但这只是一个浅拷贝(离开dll后char *数组为空)

memcpy和strncpy_s不是C ++函数,但可以在这里使用它吗?

THX

2 个答案:

答案 0 :(得分:1)

如果我说得对,你就是试图用这种方式实现GetProp:

unsigned int Interface::GetProp(const char* const szName, char* szValue)
{
    std::string value = m_xmlParser.GetNodeValue(propName);
    std::vector<char> propValue(value.begin(), value.end()); //propValue is on stack, mistake 1
    propValue.push_back('\0');
    szValue = &propValue[0]; 
}

在这一行szValue = &propValue[0];上,你使szValue指向函数返回时将被删除的内存 - 错误2,最大的错误(3)是你正在修改本地变量 - 指向char的szValue指针是本地的......

unsigned int Interface::GetProp(const char* const szName, char* szValue)
{
    std::string value = m_xmlParser.GetNodeValue(propName);
    memcpy(szValue, value.c_str(), value.length()+1);
    return ... whatever you want to ...
}

如何调用GetProp:

char buffer[MAX_SIZE_AS_PER_INTERFACE_API];
GetProp(propName, buffer);

答案 1 :(得分:0)

unsigned int Interface::GetProp(const char* const szName, char* szValue)

上述函数只能通过szValue参数调用,该参数指向某个Interface API指定的最大大小的字符缓冲区。仅仅通过查看函数就无法知道这个大小是什么......你应该检查文档,希望有一个常量定义。调用它的正确方法似乎是:

char buffer[MAX_SIZE_AS_PER_INTERFACE_API];
unsigned n = m_xmlParser.GetProp(propName, buffer);

也可能有一个单独的函数来找出属性值的长度,这样你就可以事先创建一个已知足够大的缓冲区....

在上面的代码中,propName可以是字符串文字,propName.c_str()可以是std::string

您还应该检查API以查看返回的unsigned值的含义。