不能直接将数字转换为以 null 结尾的十六进制字符串,必须转换为 std::string 然后使用 .c_str()

Cannot directly convert number to hex null-terminated string, has to convert to std::string then use .c_str()

我尝试将整数转换为十六进制空字符终止(或 "C-style")字符串,但我无法将其与 printf 或我的自定义日志函数一起使用。它只有在我将它转换为 std::string 然后在将它作为参数传递时使用 .c_str() 时才有效,这会产生丑陋且难以理解的代码。

重要的是要知道使用 std::string 并用 "str +=" 附加到它确实有效。

const char* IntToHexString(int nDecimalNumber) {
    int nTemp = 0;
    char szHex[128] = { 0 };
    char hex[] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };

    while (nDecimalNumber > 0) {
        nTemp = nDecimalNumber % 16;
        sprintf(szHex, "%s%s", hex[nTemp], szHex);

        nDecimalNumber = nDecimalNumber / 16;
    }

    sprintf(szHex, "0x%s", szHex);
    return szHex;
}

我尝试使用 Visual Studio 调试器,但它没有显示任何错误消息,因为在未加载符号的 DLL 中某处崩溃

你的主要问题是你在函数的局部栈上定义了一个变量,然后return它。

在函数returns之后,char*会指向"somewhere",一个未定义的位置。这是一个主要错误。您还有其他已经评论过的错误。像 sprintf(szHex, "0x%s", szHex);,这是未定义的行为 (UB) 或 sprintf(szHex, "%s%s", hex[nTemp], szHex);,它有同样的问题 + 另外一个错误的格式字符串。

更多的 C++ 解决方案,如许多帖子中所示:

#include <iostream>
#include <string>
#include <iomanip>
#include <sstream>

std::string toHexString(unsigned int hexValue)
{
    std::ostringstream oss;
    oss << "0x" << std::hex << hexValue;
    return std::string(oss.str());
}

int main()
{
    std::cout << toHexString(15) << '\n';
    // or directly
    std::cout << "0x" << std::hex << 15 << '\n';

    return 0;
}

当然C-Style的解决方案也是可以的。

但我不推荐以下所有内容:

如果你想使用 char * 来坚持使用类似 C 的解决方案,你可以将 char szHex[128] = { 0 }; 设为静态。或者,更好的是,传递指向缓冲区的指针和 return 它的地址,如

#include <stdio.h>
#include <iostream>

char* toHexCharP(unsigned int hexValue, char *outBuffer, const size_t maxSizeOutBuffer)
{
    snprintf(outBuffer,maxSizeOutBuffer-1,"0x%X",hexValue);
    return outBuffer;    
}

constexpr size_t MaxBufSize = 100U;

int main()
{
    char buf[MaxBufSize];
    std::cout << toHexCharP(15, buf, MaxBufSize) << '\n';
    return 0;
}

但如前所述,我不推荐。太危险了。

您的解决方案应如下所示:

std::string IntToHexString(int nDecimalNumber) {
    std::ostringstream str;
    str << std::hex << nDecimalNumber;
    return str.str();
}
// ...
std::string transformed = IntToHexString(123);

然后您可以使用 transformed.c_str() 将您的字符串设为 const char*。 除非你有理由这样做,否则你永远不应该在现代 C++ 中使用 const char*。如果需要,请使用 std::string::c_str()