Присвоение значения указателю внутри функции - PullRequest
0 голосов
/ 21 ноября 2011

Хорошо, у меня есть вопрос, я думаю о C-строках.Ниже моя модификация некоторого кода (дана в ответе на предыдущий вопрос stackoverflow!), С вызовом функции и выводом.Функция преобразует входное шестнадцатеричное число (длиной 8) в двоичное число (длиной 32).

void htoi(const char *ptr, char *binAddr) {
char value[32] = "";
char ch = *ptr;
int i;
const char* quads[] = {"0000", "0001", "0010", "0011", "0100", "0101",
                     "0110", "0111", "1000", "1001", "1010", "1011",
                     "1100", "1101", "1110", "1111"};

while (ch == ' ' || ch == '\t')
    ch = *(++ptr);

for (i = 0; i < 8; i++) {
    if (ch >= '0' && ch <= '9')
        strncat(value, quads[ch - '0'], 4);
    if (ch >= 'A' && ch <= 'F')
        strncat(value, quads[10 + ch - 'A'], 4);
    if (ch >= 'a' && ch <= 'f')
        strncat(value, quads[10 + ch - 'a'], 4);

    ch = *(++ptr);
    printf("%s\n", value);
}

*binAddr = *value;
}

Вот мой вызов функции:

char line[11], hexAddr[8], binAddr[32];
htoi(hexAddr, binAddr);
printf("%s\n", binAddr);

Вот вывод(при вводе с 001133c0):

0000

00000000

000000000001

0000000000010001

00000000000100010011

0000000000010001001100111019 *

0000000000010001001100111100

00000000000100010011001111000000

0���

Последняя строка (со специальными символами) - это printf (binAddr) в главной функции выше.Из операторов printf внутри функции ясно, что двоичный код создается правильно.

Что я делаю не так?

Ответы [ 4 ]

2 голосов
/ 21 ноября 2011

Эта строка:

*binAddr = *value;

Как вы думаете, что это делает? Оба аргумента перед применением звездочек относятся к массивам символов или указателям на char. Поэтому при разыменовании они ссылаются на один символ каждый. Таким образом, этот оператор назначает первый символ в binAddr равным первому символу в значении, тогда как, по-видимому, вы хотели вернуть всю строку.

1 голос
/ 21 ноября 2011

Вы не оставляете место для (или вставки) нулевого значения, заканчивающего массив значений, длина которого должна быть не менее 33 символов.

0 голосов
/ 21 ноября 2011
*binAddr = *value;

Эта часть функции не имеет никакого смысла.* binAddr передается в функцию и выйдет из области видимости после завершения функции.Вам нужно сохранить значение, которое вы намеревались сохранить в * binAddr, в глобальной переменной или в чем-то еще, что не выйдет за рамки.

Тот факт, что у вас есть глобальный binAddr, также запутывает проблемупоскольку он скрыт локальным binAddr.

0 голосов
/ 21 ноября 2011

вы строите символьную строку с символами '0' и '1'.что вам нужно создать, это последовательность байтов.вам нужно взять беззнаковое целое или эквивалентный 64-битный тип и установить биты в соответствии с вводом.

...