Невозможно напрямую преобразовать число в шестнадцатеричную строку с нулевым символом в конце, необходимо преобразовать в std :: string, а затем использовать .c_str () - PullRequest
0 голосов
/ 24 июня 2019

Я пытался преобразовать целое число в строку с шестнадцатеричным символом в конце (или "в стиле C"), но я не могу использовать его с 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 Debugger, но он не показывает никаких сообщений об ошибках, потому что происходит сбой где-то в DLL, в которой не загружены символы

Ответы [ 2 ]

0 голосов
/ 24 июня 2019

Ваше решение должно выглядеть следующим образом:

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*. Если у вас нет причин для этого, вы никогда не должны работать с const char* в современном C ++. Используйте std::string::c_str(), если вам нужно.

0 голосов
/ 24 июня 2019

Ваша основная проблема заключается в том, что вы определяете переменную в стеке локально в функции, а затем возвращаете ее.

После возврата из функции символ * будет указывать на «где-то», на неопределенную позицию.Это серьезная ошибка.У вас также есть другие ошибки, которые уже были прокомментированы.Например, 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;
}

Но, как я уже сказал, я бы не советовал.Слишком опасно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...