Ваша основная проблема заключается в том, что вы определяете переменную в стеке локально в функции, а затем возвращаете ее.
После возврата из функции символ * будет указывать на «где-то», на неопределенную позицию.Это серьезная ошибка.У вас также есть другие ошибки, которые уже были прокомментированы.Например, 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 также возможно.
Но все следующее я бы не рекомендовал:
Если вы хотите придерживаться решения, подобного C, с char*, вы можете сделать char szHex[128] = { 0 };
статичным.Или, что еще лучше, передайте указатель на буфер и верните его адрес, как в
#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;
}
Но, как я уже сказал, я бы не советовал.Слишком опасно.