#arrays #c
#массивы #c
Вопрос:
Я пытаюсь преобразовать массив символов ASCII в шестнадцатеричный массив символов, чтобы сделать что-то подобное:
Ввод : char string[5]="abcd1234567"
Выход : char buf[4096] = {0x63, 0x61, 0x62, 0x63, 0x64, 0x31, 0x32, 0x33 0x34, 0x35, 0x36, 0x37};
но мой код не работал, и я не мог его понять.
код:
char string[20]="abcd"; char buff[4000]; sprintf(buff[0],"x",string[0]); printf("string[0]: %c",string[0]);
это приводит к этой ошибке:
warning: passing argument 1 of 'sprintf' makes pointer from integer without a cast [-Wint-conversion] 16 | sprintf(buff[0],"x",string[0]);
Комментарии:
1. Подсказка: это уже в таком формате.
2. Похоже, это всего лишь предупреждение, а не ошибка
3. Первым аргументом к
sprintf
необходимости бытьbuff
неbuff[0]
должно ….4.
string[5]
слишком коротка5. Ваш вывод в первом примере неверен. Вывод показывает
'c
» как первый элемент в строке (0x63).
Ответ №1:
Нет никакой разницы между (char)'a'
и (char)0x61
на компьютере на основе ASCII, поэтому все, что вам нужно, это следующее:
char buf[4096]; memset(buf, 0, sizeof(buf)); strncpy(buf, string, sizeof(buf));
memset
Устанавливает конечные элементы в 0
положение «как char buf[4096] = { ... };
бы». Вы можете избавиться от него, если вас не волнуют конечные элементы.
Он strncpy
выполняет следующие действия:
buf[ 0] = string[ 0]; // 'a' 0x61 buf[ 1] = string[ 1]; // 'b' 0x62 ... buf[11] = string[11]; // '7' 0x37 buf[12] = string[12]; // '' 0x00
Обратите внимание, что копируется конечное значение NUL. Но это несущественно, учитывая наличие дополнительной комнаты buf
. Используйте memcpy
вместо strncpy
, если вы хотите избежать этого дополнительного НУЛЯ.
Комментарии:
1. Я предположил, что операция хочет вывести полное определение массива в виде текста (для вставки в другую программу).
2. Вы также думаете, что char
string[5]="abcd1234567"
-это код C для анализа?3. Нет, я думаю, что «Вывод :
char buf[4096] = {0x63, 0x61, 0x62, 0x63, 0x64, 0x31, 0x32, 0x33 0x34, 0x35, 0x36, 0x37};
» есть.4. @Флюгер, я нахожу менее вероятным, что для ввода и вывода используются две разные обозначения, и более вероятно, что операция не знает, что это уже одни и те же байты.