Вопрос по c – Программирование на C: Преобразование Hex Int в Char *

3

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

    int i = 0x11111111;

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

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

Ваш Ответ

4   ответа
0

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

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

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

Вот пример:

int i = 0x11111111;

char szHexPrintBuf[10];

int ret_code = 0;

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

if(0 > ret_code)
{ 
   something-bad-happend();
}
4

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

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

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

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

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

⌈logb(n + 1)⌉

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

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

Затем:

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

Или же:

itoa(i, buffer, 16);

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

char *p = buffer;

Похожие вопросы