2017-11-28 23 views
0

DecimalをBinaryに変換して戻すプログラムを作成しようとしています。私の問題は、小数部分がバイナリで大きすぎてプログラムがクラッシュするときです。私はこの問題に多くの異なるアプローチを試みましたが、それらのどれも働いていませんでした...なぜそれが起こるのかわかりませんので、私はそれのための解決策がありません。 このプログラムには問題のみが含まれています。Cで商を使った10進数から2進数への変換

私を助けてください。

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; 
} 
+2

ご参考までに不要なものをコードから削除することができます。これにはコメントアウトされたコードとうまく動作するコードが含まれます。問題を示すコードだけを残してください。この問題は見やすいのでここでは必要ではありませんでしたが、他の場合には必要になるかもしれません。ここをクリック:[mcve] – anatolyg

答えて

4

この:

binaryfirst = malloc(sizeof(char*)); 

and 

binarysecond = malloc(sizeof(char*)); 

は、ポインタのサイズを割り当てますが、それへの書き込みループは、それが明確にそれがその場所で最大60のバイトを保存するために期待していることになります。これはまったく意味がありません。 Cは、あなたがoutsiteを書くときに魔法のように割り当てを増やすのではなく、未定義の動作を得ます。

ヒープメモリ割り当てについて不明な点があり、解決しようとしている問題に不可欠ではない場合は、まず何もせずに実行してください。

char binaryfirst64]; 
char binarysecond[64]; 
+2

'binaryfirst'にも問題があります。 OPがこれまでに 'malloc'を使用したことはないようです。 –

+0

@TomKarzesありがとう、編集されました。 – unwind

関連する問題