不能直接将数字转换为以 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()
。
我尝试将整数转换为十六进制空字符终止(或 "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()
。