使用C中的商进行十进制到二进制转换

时间:2017-11-28 12:31:23

标签: c

我尝试创建一个将Decimal转换为Binary并返回的程序。我的问题是当分数部分在二进制中变得太大时,我的程序崩溃了。我尝试了很多不同的方法来解决这个问题,但没有一个能够解决这个问题...我不知道为什么会这样,所以我没有解决它。 该程序仅包含问题。

请帮帮我。

example1: 10 10.5 -> Program works fine

example2:10 10.23 -> Program crashes 

以上是例子。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

int main(){

  int base;
  double number;
  scanf("%d %lf",&base,&number);

  if(base == 10){
    //Integer Part
    int n = (int)number;
    number = number - (double)n;
    int i = 0;
    char *binaryfirst;
    binaryfirst = malloc(sizeof(char*));

    while(n != 0){
      binaryfirst[i] = (n % 2) + '0';
      n /= 2;
      i++;
    }
    binaryfirst[i] = '\0';
    strrev(binaryfirst);
    //printf("%lf\n%s\n",number,binaryfirst);

    //Fractional part
    int j = 0;
    char *binarysecond;
    binarysecond = malloc(sizeof(char*));
    //This is The part where I am lost...
    for(j = 0; j < 60; j++){ //60 is the maximum length that it can become
      number *= 2;
      if(number >= 1.0){
        binarysecond[j] = '1';
        number = number - 1;
      }else if(number == 0){
        binarysecond[j] = '0';
        break;
      }else{
        binarysecond[j] = '0';
      }
      printf("%lf; %c\n",number, binarysecond[j]);
    }
    printf("%d\n",j);
    binarysecond[j] = '\0';
    //printf("\n%s\n",binarysecond);

   //Memory "Let it go"!!!!
   /* for(i = 0; i < sizeof(binaryfirst); i++){
      free(binaryfirst[i]*2);
   }*/
    free(binaryfirst);

   /* for(j = 0; j < sizeof(binarysecond); j++){
      free(binarysecond[j]);
    }*/
    free(binarysecond);


  }

  return 0;
}

1 个答案:

答案 0 :(得分:4)

此:

binaryfirst = malloc(sizeof(char*));

and

binarysecond = malloc(sizeof(char*));

分配指针的大小,但写入它的循环清楚地表明它希望在该位置存储最多60个字节。这毫无意义;当你编写outsite时,C并没有神奇地增加分配,而是你得到了未定义的行为。

如果你不确定堆内存分配,并且它们对你试图解决的问题不是至关重要的,那么首先不要做任何事情。只需使用简单的数组:

char binaryfirst64];
char binarysecond[64];