gpt4 book ai didi

c++ - 从 const char * 或 LPCSTR 构建 std::string 时数据丢失

转载 作者:行者123 更新时间:2023-11-30 02:44:15 30 4
gpt4 key购买 nike

我有一个返回 LPSTR/const char * 的函数,我需要将它转换为 std::string。我就是这样做的。

std::string szStr(foo(1));

它在所有情况下都工作得很好,只是当 foo 返回一个 32 个字符长的字符串时它失败了。通过这种方法,我得到了 ""。所以我认为它必须与长度有关。所以我稍微改变了一下。

std::string szStr(foo(1) , 32);

这给了我 "0"

然后我尝试了另一种繁琐的方法

const char * cstr_a = foo(1);
const char * cstr_b = foo(2);

size_t ln_a = strlen(cstr_a);
size_t ln_b = strlen(cstr_b);

std::string szStr_a( cstr_a , ln_a );
std::string szStr_b( cstr_b , ln_b );

但奇怪的是,在这个方法中,两个指针都得到相同的值,即 foo(1) 应该返回 abc 而 foo(2) 应该返回 xyz。但是这里cstr_a首先得到的是abc,而cstr_b得到xyz的那一刻,cstr_a和cstr_b的值都变成了xyz。我对此感到茫然和困惑。

是的,我不能使用 std::wstring。

什么是 foo?

foo 基本上是从注册表中读取一个值并将其作为 LPSTR 返回。现在我需要读取的注册表中的一个值是一个 MD5 哈希字符串(32 个字符),这就是它失败的地方。

实际的 Foo 函数:

LPCSTR CRegistryOperation::GetRegValue(HKEY hHeadKey, LPCSTR szPath, LPCSTR szValue)
{
HKEY hKey;
CHAR szBuff[255] = ("");
DWORD dwBufSize = 255;

::RegOpenKeyEx(hHeadKey, (LPCSTR)szPath, 0, KEY_READ, &hKey);
::RegQueryValueEx(hKey, (LPCSTR)szValue, NULL, 0, (LPBYTE)szBuff, &dwBufSize);
::RegCloseKey(hKey);

LPCSTR cstr(szBuff);

return cstr;
}

原版 Actor 代码:

StrResultMap RegValues;
std::string lid(CRegistryOperation::GetRegValue(HKEY_CURRENT_USER, REG_KEY_HKCU_PATH, "LicenseID"));
std::string mid(CRegistryOperation::GetRegValue(HKEY_CURRENT_USER, REG_KEY_HKCU_PATH, "MachineID"), 32);
std::string vtill(CRegistryOperation::GetRegValue(HKEY_CURRENT_USER, REG_KEY_HKCU_PATH, "ValidTill"));
std::string adate(CRegistryOperation::GetRegValue(HKEY_CURRENT_USER, REG_KEY_HKCU_PATH, "ActivateDT"));
std::string lupdate(CRegistryOperation::GetRegValue(HKEY_CURRENT_USER, REG_KEY_HKCU_PATH, "LastUpdate"));

RegValues["license_id"] = lid;
RegValues["machine_id"] = mid;
RegValues["valid_till"] = vtill;
RegValues["activation_date"] = adate;
RegValues["last_updated"] = lupdate;

请帮助我克服它。谢谢。

最佳答案

作为 Nordic Mainframe 的 anwser 的补充,有 3 种常见的方法可以从 C 或 C++ 函数返回缓冲区:

  • 使用静态缓冲区 - 简单又好用,直到遇到重入问题(多线程或递归)
  • 将缓冲区作为输入参数传递,并简单地返回写入其中的字符数 - 如果缓冲区的大小确实是一个常量,则可以
  • malloc 函数中的缓冲区(它在堆中而不是堆栈中)并以闪烁的红色记录它必须由调用者释放

但是当您将问题标记为 C++ 时,您可以在函数中创建 std::string 并将其返回。允许 C++ 函数返回 std::string,因为不同的运算符(复制构造函数、矫揉造作等)会自动处理分配问题。

关于c++ - 从 const char * 或 LPCSTR 构建 std::string 时数据丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25385009/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com