Программирование на C: Преобразование Hex Int в Char *

Мой вопрос заключается в том, как бы я конвертировать что-то вроде:

    int i = 0x11111111;

на указатель символа? Я попытался использовать функцию itoa (), но это дало мне исключение с плавающей точкой.

 Oliver Charlesworth27 мая 2012 г., 00:29
Не существует такой вещи, как «hex int». Это просто нормальноint, значение которого вы указали в шестнадцатеричном представлении.
 Marvo27 мая 2012 г., 00:29
Это не "hex int". Это просто "int". & quot; Hex int & quot; это одно представление целого числа. Или представление значения в базе 16. Чтобы превратить int в указатель любого типа, вы просто приводите его: char * p = (char *) i; Вероятно, не очень хорошая практика, однако.
 Daniel Fischer27 мая 2012 г., 00:29
Или жеs(n)printf()?
 Steve Jessop27 мая 2012 г., 00:33
@ Бхубху: Могу поспорить, что это не дает ошибку сегментации, когда вы ее разыгрываете. Бьюсь об заклад, ошибка сегментации приходит позже, когда вы делаете что-то с этим указателем Если вы не показываете свой код, тогда люди будут делать неверные предположения об этом и тратить время каждого.
 Ation27 мая 2012 г., 00:28
Вы имеете в виду char * cp = (char *) i; ?

Ответы на вопрос(4)

sprintf(charBuffer, "%x", i);  - Я думаю, что будет работать очень хорошо.

 28 мая 2012 г., 00:58
@BenVoigt Спасибо, что поймали это. Я больше не программирую на C и просто забыл это правило.
 28 мая 2012 г., 01:15
Правка, которую вы одобрили @BenVoigt, была отклонена. Я только что подал еще раз.
 28 мая 2012 г., 00:51
@octopusgrabbus: Почему вы добавили актерский состав? Он не дает никакой пользы и потенциально опасен (отключение полезных предупреждений компилятора, которые бы перехватывали ошибки типов во время компиляции, а не сбой во время выполнения).
 28 мая 2012 г., 01:28
Я откатился на этот ответ. @ octopusgrabbus - если вы хотите ответить на вопрос, пожалуйста, сделайте это как ответ. Пожалуйста, не редактируйте другой ответ, чтобы добавить свой собственный код.

sprintf() Функция для преобразования целого числа в шестнадцатеричное должна выполнить вашу задачу.

Вот пример:

int i = 0x11111111;

char szHexPrintBuf[10];

int ret_code = 0;

ret_code = sprintf(szHexPrintBuf, "%x", i);

if(0 > ret_code)
{ 
   something-bad-happend();
}
Решение Вопроса

itoa это нестандартно. Держись подальше.

Одна из возможностей заключается в использованииsprintf и правильный спецификатор формата для hexa, т.е.x и делать:

char str[ BIG_ENOUGH + 1 ];
sprintf(str,"%x",value);

Однако проблема с этим вычислением размераvalue массив. Вы должны сделать с некоторыми предположениями иFAQ 12.21 хорошая отправная точка.

Количество символов, необходимое для представления числа в любой базеb может быть аппроксимирована следующей формулой:

⌈logb(n + 1)⌉

Добавьте еще пару, чтобы держать0x, если нужно, а затем вашBIG_ENOUGH готов.

 27 мая 2012 г., 00:42
@Ruben: без0x префикс для гекса, да.
 27 мая 2012 г., 00:34
Для int (4 байта) легко определить достаточный размер: 9 для шестнадцатеричного, 11 для десятичного, 33 для двоичного.
 27 мая 2012 г., 00:43
Конечно, без префикса - только для самого числа и \ 0 в конце строки.
char buffer[20];

Затем:

sprintf(buffer, "%x", i);

Или же:

itoa(i, buffer, 16);

Символьный указатель на буфер может бытьbuffer сама (но это const) или другая переменная:

char *p = buffer;

Ваш ответ на вопрос