簡體   English   中英

將std :: string深度復制到char *的正確方法

[英]Correct way to deep copy std::string to char*

我應該使用哪種解決方案通過C ++中的dll邊界將std :: string的某些內容深度復制到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 ++函數,但是可以在這里使用嗎?

謝謝

如果我正確理解它,則嘗試以這種方式實現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);
unsigned int Interface::GetProp(const char* const szName, char* szValue)

只能使用指向某個接口API指定的最大大小的字符緩沖區的szValue參數調用上述函數。 僅通過查看函數就無法知道該大小是多少...應該檢查文檔,因為希望在某個地方定義了一個常量。 正確的調用方式似乎是:

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

也可能有一個單獨的函數來找出屬性值的長度,以便您可以事先創建一個已知足夠大的緩沖區。

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

您還應該檢查API以查看返回的unsigned值的含義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM