Я пытался написать программу, которая берет адрес и переворачивает его для каждых двух символов. Пример ввода будет "0xefba5896", а в идеале вывод будет "\x96\x58\xba\xef". Проблема, с которой я сталкиваюсь, заключается в том, что первые несколько байтов работают, но последний не печатается. Мой код ниже:
int i;
char *add = argv[1];
char rev[8];
char xa[2];
strncpy(rev, &add[2], strlen(add));
for (i = strlen(rev) - 2; i > -2; i-=2) {
if (i == 0) {
strncpy(xa, &rev[0], 2);
} else {
strncpy(xa, &rev[i], 2);
xa[2] = '\0';
}
printf("\\x%s", xa);
}
Если я ввожу "0xefba5896", мой вывод:
\x96\x58\xba\x
Если для кого-то ответ очевиден, пожалуйста, простите меня. Я изучаю C всего около недели. Будем очень признательны за любую помощь!
Почему вы пытаетесь это сделать? Как вы думаете, это квалифицируется как Проблема XY? Если да, то чем на самом деле вы хотите заниматься? Изменить порядок байтов целого числа?
for (i = strlen(rev) - 2; i > -2; i-=2)
— этоrev
вход? Было бы полезно, если бы вы дали своим переменным более осмысленные имена. В любом случае, что происходит, когдаstrlen(rev)
является нечетным числом?Также обратите внимание: 1.
strncpy()
— сложная функция, иногда она пропускает разделитель null, и в большинстве случаев вы можете заменить его наmemcpy()
, если знаете, что делаете. 2. Вы злоупотребилиstrncpy()
, потому что, чтобы просто скопировать 2 байта, вы можете просто сделать это, назначив их напрямую.Нет смысла передавать
strlen(add)
в качестве ограничивающего фактора вstrncpy
, еслиadd
длиннее 8, вы все равно переполнитесьrev
! Вы должны передать размер места назначения, а не размер источника. Таким образом, правильный вызовstrncpy(rev, add +2, sizeof rev);