Символ для представления шестнадцатеричного числа из int с префиксом ‘0x0’

#c #formatting #hex

#c #форматирование #шестнадцатеричный

Вопрос:

Моя цель: я создаю приложение с использованием MFC в Visual Studio 2015. Я создал таблицу с двумя столбцами, которые содержат числа и значения многих регистров, и выглядит она следующим образом:

введите описание изображения здесь

чтобы заполнить эту таблицу удобным способом, я хочу создать цикл for, который отправит строку LPCSTR (которая автоматически интерпретируется как const char) в функцию-член класса CListCtrl, которая называется insertItem. Я хочу, чтобы эта строка LPCSTR выглядела как шестнадцатеричное число 0x01 или 0x14, когда значение после префикса 0x будет определяться индексом цикла в шестнадцатеричной базе. например:

 
char buffer[3*sizeof(int)];
int l_iItem;
for (int index = REGS_NUMBER; index >= 0; index--) {
        // Somehow make buffer look like 0xN when N is the index value in hex representation stuffed with 
        // zeroes if needed;
        l_iItem = m_EditableList.InsertItem(LVIF_TEXT | LVIF_STATE, 0, buffer, 0, LVIS_SELECTED, 0, 0);
        m_EditableList.SetItemText(l_iItem, 1, "00000000");
  

Я видел много вопросов по этой теме, но почти все они предлагали способ решения этой проблемы, который подходит только в том случае, если я хочу вывести число в стандартный вывод, но я хочу напечатать его в переменной типа char (как было хорошо сказано в комментариях). Я был бы благодарен, если бы кто-нибудь мог направить меня к соответствующей функции.

Спасибо.

===========================================================================

Как предложил Тушар, я попытался добавить эти заголовки:

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

и попробовал запустить следующий код:

     char* n;
    
    int i = 7;
    //std::istringstream s("2A");


    n << std::hex << std::showbase << i;

    std::cout << n;
  

ошибки, которые я получаю:

 expression must have integral or unscoped enum.
'hex' is not a member of std.
'showbase' is not a member of std.
undeclared identifier.
undeclared identifier.
  

еще одно испытание: как было предложено в его комментариях, я попытался использовать ostringstream вместо char * следующим образом:

     std::ostringstream ss;
    int i = 7;
    ss << std::hex << std::showbase << i;

    std::string str = ss.str();
    const char *output = str.c_str();
  

Я получаю те же ошибки, хотя я включил все необходимые заголовки. в чем может быть проблема?

Комментарии:

1. Создайте char массив и используйте fprintf для записи в него числа.

2. Печать — это то, что вы хотите сделать, но вы хотите «печатать» в строку, а не в консоль. Прочитайте о std::ostringstream .

3. << std::hex не работает на char* . Это часть раздела IOStreams стандартной библиотеки. Он будет работать с std::cout , std::ofstream , std::ostringstream и подобными.

Ответ №1:

ios_baseamp; hex (ios_baseamp; str);

Он используется для установки флага формата базового поля для потока str в шестнадцатеричное значение. Когда базовое поле установлено в шестнадцатеричное, целочисленные значения, вставленные в поток, выражаются в шестнадцатеричной базе (т. Е. с основанием 16). Ожидается, что для входных потоков извлеченные значения также будут выражены в шестнадцатеричной базе, когда установлен этот флаг.

Если вы хотите проанализировать строку в шестнадцатеричной базе

std::istringstream(«2A») >> std::hex >> n;

Пример использования шестнадцатеричной базы.

 #include <iostream>
#include <sstream>
#include <iomanip>
int main()
{
    std::cout << "Parsing string "10 0x10 010"n";
 
    int n1, n2, n3;
    std::istringstream s("10 0x10 010");
    s >> std::setbase(16) >> n1 >> n2 >> n3;
    std::cout << "hexadecimal parse: " << n1 << ' ' << n2 << ' ' << n3 << 'n';
     s >> std::setbase(0) >> n1 >> n2 >> n3;
    std::cout << "prefix-dependent parse: " << n1 << ' ' << n2 << ' ' << n3 << 'n';
 
    std::cout << "hex output: " << std::setbase(16)
              << std::showbase << n1 << ' ' << n2 << ' ' << n3 << 'n';
}
  

Комментарии:

1. Спасибо за ваш комментарий, но я не могу заставить его работать. не могли бы вы привести мне пример? кроме того, это не совсем решает мою проблему, поскольку я хочу, чтобы он также имел префикс «0x0» или просто «0x» в зависимости от длины целого числа (т. Е. 0x01 или 0x15)

2. Я не понимаю, что вы именно делаете. Будет иметь больше смысла, если вы покажете еще немного кода