Добавление целых чисел как char для создания строки в C

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

void binary(int decimal) {
  int modulus;
  char bin[9];
  while (decimal != 0) {
    modulus = decimal % 2;
    sprintf(bin, "%d", modulus);
    if (modulus == 1) {
      decimal--;
    }
    decimal = decimal / 2;
  }
  puts(bin);
}

Если десятичная дробь равна 10, тогда используется только 1 вместо 0101. Как я могу это исправить? Я использую Turbo C ++ 3.0.


person UbadahJ    schedule 30.08.2017    source источник
comment
sprintf(bin, "%d", modulus); Ты всегда пишешь спереди.   -  person BLUEPIXY    schedule 30.08.2017
comment
Это нетривиально, потому что он записывает цифры в обратном порядке. Я отправил ответ, но он печатает двоичную строку в обратном порядке, так что ничего хорошего. рекурсия или обратная строка впоследствии должны решить эту проблему.   -  person Jean-François Fabre    schedule 30.08.2017
comment
И чтобы не всегда писать спереди, увеличивайте указатель (bin) каждый раз, когда вы пишете в него (но сохраняйте ссылку на начало строки для возврата).   -  person Hans Petter Taugbøl Kragset    schedule 30.08.2017
comment
@ Jean-FrançoisFabre Ожидаемый результат OP обратный. Например, 0101: 10 (основание 10)   -  person BLUEPIXY    schedule 30.08.2017
comment
Я знаю, что ответ будет обратным, поэтому я беру результат в виде строки, а затем переворачиваю ее для печати как вывода.   -  person UbadahJ    schedule 30.08.2017
comment
NB: вам не нужно уменьшать нечетное значение перед делением. Например. 5/2 в целочисленном делении равно 2, так как оно округляется в меньшую сторону   -  person king_nak    schedule 30.08.2017
comment
Комментарий BLUEPIXY содержит ответ. sprintf переопределяет строку, поэтому на каждой итерации вы начинаете заново. Вам нужно найти способ объединить строки   -  person king_nak    schedule 30.08.2017
comment
@king_nak переопределяет - ›перезаписывает.   -  person Jabberwocky    schedule 30.08.2017


Ответы (3)


Это как раз ваша функция с небольшими изменениями и комментариями.

Однако двоичная строка по-прежнему перевернута.

void binary(int decimal) {
  int modulus;
  char bin[9];
  char temp[2];   // temporary string for sprintf

  bin[0] = 0;     // initially binary string set to "" (empty string)

  while (decimal != 0) {
    modulus = decimal % 2;

    sprintf(temp, "%d", modulus);  // print '1' or '0' to temporary string
    strcat(bin, temp);             // concatenate temporary string to bin

    if (modulus == 1) {
      decimal--;
    }
    decimal = decimal / 2;
  }
  puts(bin);
}

Есть более эффективные способы добиться этого, особенно используя оператор сдвига влево (<<), таким образом, вы можете создать двоичную строку напрямую, не обращая ее в конце.

person Jabberwocky    schedule 30.08.2017
comment
Спасибо за Ваш ответ. На самом деле я сделал тот же код, следуя советам из комментариев. Однако ваш код подтвердил мой код. Спасибо! - person UbadahJ; 30.08.2017
comment
разве это не генерирует обратное число? - person Jean-François Fabre; 30.08.2017
comment
@ Jean-FrançoisFabre да, прочтите второе предложение ответа. - person Jabberwocky; 30.08.2017
comment
хорошо, поэтому я восстанавливаю свой ответ, это проще, потому что он не использует временный & strcat. - person Jean-François Fabre; 30.08.2017
comment
Вы можете удалить temp и strcat, используя sprintf(bin, "%s%d", bin, modulus). Затем, чтобы получить строку в правильном порядке, просто поменяйте параметры местами: sprintf(bin, "%d%s", modulus, bin) - person king_nak; 30.08.2017
comment
@king_nak с использованием sprintf для печати строки в самой себе приводит к неопределенному поведению: stackoverflow.com/questions/1973572/ - person Jabberwocky; 30.08.2017

Вот функция, которая выводит десятичное число как двоичное:

void print_binary(int num)
{
    int pos = (sizeof(int) * 8) - 1;
    printf("%10d: ", num);

    for (int i = 0; i < (int)(sizeof(int) * 8); i++) {
        char c = num & (1 << pos) ? '1' : '0';
        putchar(c);
        if (!((i + 1) % 8))
            putchar(' ');
        pos--;
    }
    putchar('\n');
}

выход:

        42: 00000000 00000000 00000000 00101010
person Hans Petter Taugbøl Kragset    schedule 30.08.2017
comment
Разве нельзя создать строку с использованием целых чисел? Ваш ответ - то, что я хотел, я просто хотел узнать, что я сделал не так - person UbadahJ; 30.08.2017

конечно, вы печатаете в том же bin месте, не перемещая "курсор".

Объявление указателя на строку и увеличение его после каждого sprintf должно работать, поскольку sprintf выдает только 1 цифру + символ завершения нуля.

char bin[9];
char *ptr = bin;
  while (decimal != 0) {
    modulus = decimal % 2;
    sprintf(ptr, "%d", modulus);
    ptr++;

который генерирует строку, но в обратном порядке (потому что младшие биты обрабатываются первыми). Просто распечатайте его в обратном порядке или потом переверните.

 int l = strlen(bin);
 for (i=0;i<l;i++)
 {
     putc(bin[l-i-1]);
 }
 putc("\n");
person Jean-François Fabre    schedule 30.08.2017