Изменение функции для приема целого числа вместо указателя char для преобразования двоичного в восьмеричное и шестнадцатеричное в C

В настоящее время у меня есть код для преобразования указателя char, который содержит двоичные символы, и преобразует их в шестнадцатеричные и восьмеричные представления.

Как продвигался мой код, теперь у меня есть целое двоичное число, это больше не указатель на символ, но я все еще хочу преобразовать его в шестнадцатеричный или восьмеричный.

Итак, код, который у меня есть, преобразует: «1101» в шестнадцатеричный или восьмеричный эквивалент, но в настоящее время у меня есть 1101 как целочисленное значение, но я все еще хочу преобразовать его в шестнадцатеричный или восьмеричный.

Я не знаю, как переписать код, чтобы он принимал целочисленный двоичный файл в качестве аргумента вместо двоичного char *. Или как изменить int, который у меня есть, на указатель char, чтобы он мог успешно пройти функцию преобразования.

Вот код вызова функции, который current работает с указателем char на двоичное представление числа, преобразуя его в восьмеричное или шестнадцатеричное представление:

output = binaryBaseChange(output, 3); //for binary to octal conversion
output = binaryBaseChange(output, 4); //for binary to hex conversion

Вот функция преобразования, использующая аргумент char * bin:

char * binaryBaseChange (char * bin, int size_of_digit) {
int offset = 0;
int i = 0;
int j = 4;
int k = 0;
int number_of_hex_digits = 0;
char* substr;
char * out;
int r = 0;


while(((strlen(bin) + offset) % size_of_digit) != 0) {
    offset++;
}

out = malloc((strlen(bin) + offset) / size_of_digit+1);
out[(strlen(bin)+offset)/size_of_digit] = '\0';

r = (int)strlen(bin) + offset;

bin = pad_bin(bin, r);
number_of_hex_digits = (int)strlen(bin)/size_of_digit;

while (k < number_of_hex_digits) {
    substr = strndup(bin+i, j);
    substr[size_of_digit] = '\0';

    i = i + size_of_digit;
    j = j + size_of_digit;

    if (size_of_digit == 4) {
        out[k] = single_digit_bin_to_hex(substr);
    } else if (size_of_digit == 3) {
        out[k] = single_digit_bin_to_oct(substr);
    }
    free(substr);
    k++;
}
free(bin);
out[k] = '\0';
return out;
 }

Вот функции, вызываемые внутри функции преобразования:

char single_digit_bin_to_oct (char * bin_dig) {
if (strcmp(bin_dig, "000") == 0) {
    return '0';
} else if (strcmp(bin_dig, "001") == 0) {
    return '1';
} else if (strcmp(bin_dig, "010") == 0) {
    return '2';
} else if (strcmp(bin_dig, "011") == 0) {
    return '3';
} else if (strcmp(bin_dig, "100") == 0) {
    return '4';
} else if (strcmp(bin_dig, "101") == 0) {
    return '5';
} else if (strcmp(bin_dig, "110") == 0) {
    return '6';
} else {
    return '7';
}
}

char single_digit_bin_to_hex (char *bin_dig) {

if (strcmp(bin_dig, "0000") == 0) {


    return '0';
 } else if (strcmp(bin_dig, "0001") == 0) {

    return '1';
} else if (strcmp(bin_dig, "0010") == 0) {

    return '2';
} else if (strcmp(bin_dig, "0011") == 0) {

    return '3';
} else if (strcmp(bin_dig, "0100") == 0) {

    return '4';
} else if (strcmp(bin_dig, "0101") == 0) {

    return '5';
} else if (strcmp(bin_dig, "0110") == 0) {

    return '6';
} else if (strcmp(bin_dig, "0111") == 0) {

    return '7';
} else if (strcmp(bin_dig, "1000") == 0) {

    return '8';
} else if (strcmp(bin_dig, "1001") == 0) {

    return '9';
} else if (strcmp(bin_dig, "1010") == 0) {

    return 'A';
} else if (strcmp(bin_dig, "1011") == 0) {

    return 'B';
} else if (strcmp(bin_dig, "1100") == 0) {

    return 'C';
} else if (strcmp(bin_dig, "1101") == 0) {

    return 'D';
} else if (strcmp(bin_dig, "1110") == 0) {

    return 'E';


} else if (strcmp(bin_dig, "1111") == 0){

    return 'F';
} else {
    fprintf(stderr, "ERROR");
    return 'X';
}
}


char * pad_bin (char * bin, int n) {
int bin_len = (int)strlen(bin);
int dif = n - bin_len;
char * new_bin = malloc(n + 1);
int i = 0;
int j = 0;

memset(new_bin,0,n+1);

if (n == 0) {
    return bin;
} else for (;i <= n; i++) {
    if (i < dif) {
        new_bin[i] = '0';
    } else {
        new_bin[i] = bin[j];
        j++;
    }

}


return new_bin;
}

person Bret    schedule 06.07.2015    source источник
comment
тебе нужно int to binary string? Например, 12 -> "1100"   -  person BLUEPIXY    schedule 06.07.2015
comment
Прямо сейчас у меня есть 1100, которое является целым числом в двоичном формате, и я хочу преобразовать его в шестнадцатеричное или восьмеричное. Но код, который у меня есть, преобразует 1100 строк (точнее, указатель char) в шестнадцатеричный или восьмеричный. Я не знаю, как переписать код, чтобы преобразовать указатель int, а не указатель char.   -  person Bret    schedule 06.07.2015
comment
Вместо того, чтобы переписывать функцию, вы можете пойти по ленивому маршруту и ​​написать для нее оболочку, которая изменит ваш int на указатель char, который функция распознает.   -  person Alexguitar    schedule 06.07.2015
comment
Вы знаете, как это сделать? Потому что я думал об этом, но мне труднее всего понять, как изменить мой int на указатель char.   -  person Bret    schedule 06.07.2015
comment
ты хочешь sprintf(binstr, "%d", intbin);   -  person BLUEPIXY    schedule 06.07.2015
comment
Итак, просто чтобы уточнить, делает это: char binstr[] = ; sprintf(binstr, %d, intbin); fprintf(stdout, %s\n, binstr); binstr = binaryBaseChange (binstr, 3); Действительный? Я тестирую это сам, но я просто хочу еще раз проверить с теми, у кого больше опыта использования sprintf.   -  person Bret    schedule 06.07.2015
comment
Итак, очевидно, есть некоторые проблемы с char binstr[]=. Изменится на char*binstr =NULL и посмотрите, работает ли это.   -  person Bret    schedule 06.07.2015
comment
Обратите внимание на мои комментарии #1 и #2 к вашему предыдущему вопрос. Ваш код повторяется. Меня не убеждает базовый алгоритмический выбор здесь, но, по крайней мере, используйте инициализированный массив плюс цикл для замены блоков, таких как } else if (strcmp(bin_dig, "0011") == 0) { return '3'; }, в вашем коде выше.   -  person Jonathan Leffler    schedule 06.07.2015
comment
в некоторых случаях возникает проблема с начальным параметром 'bin', в зависимости от фактической длины/значения в 'bin', переданный параметр будет передан в free(), в других случаях будет использоваться локально заданный malloc указатель передано бесплатно(). Таким образом, в зависимости от входных данных, «bin» вызывающего абонента может передаваться или не передаваться в функцию free(). Проблемы возникают в функции pad_bin(). Предложение: всегда возвращать new_bin после копирования содержимого 'bin' в 'new_bin'   -  person user3629249    schedule 07.07.2015
comment
для удобочитаемости для нас, людей, используйте последовательные отступы. Предлагайте 4 пробела после каждой открывающей скобки '{' и убирайте отступ перед каждой закрывающей скобкой '}'. Примечание: никогда не используйте табуляцию для отступа, потому что у каждого редактора/текстового процессора ширина табуляции/позиция табуляции установлены по-разному.   -  person user3629249    schedule 07.07.2015
comment
вместо того, чтобы вызывать strlen() снова и снова, вызовите ее один раз и сохраните результат в локальной переменной.   -  person user3629249    schedule 07.07.2015
comment
всегда проверяйте (!=NULL) возвращаемое значение от malloc(), чтобы убедиться, что операция прошла успешно   -  person user3629249    schedule 07.07.2015