2017-05-04 10 views
-3

コードがコンパイルされています。私が実行すると、私はちょうどメッセージ(セグメンテーションフォールト(コアダンプ))を取得します。どんな助けでも大歓迎です!セグメンテーションフォルト(コアダンプ) - Cセグメンテーションフォルトに関する問題がなくなりました。今私はデバッグすることができます。ありがとう

プログラムは、入力された引数の基数を変更することになっています。 10 出力ベース:入力ベースで2つの 引数:10 2 5 6 7 入力ベース./convert例えば5 6 7

私はちょうど...あなたが提供できるすべてのヘルプをCを学ぶために始めているだろう素晴らしいよ! ありがとう!

編集済み:セグメンテーションフォルトに問題はありません。ありがとうございました。 * toStrongに逆

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




int makeInt(char digits[]) { 
    int num = 0; 
    int i = 0; 
    while (digits[i] != '\0') { 
    num = num * 10 + (digits[i] - '0'); 
    i++; 
} 
return num; 
} 


//converts from original base to base 10 
int makeBase10(char digits[],int a) { 
    int num = 0; 
    int pow = 1; 
    int i = 0; 
    int x = 0; 
    int length = strlen(digits); 
    char k; 
    for (i = length -1; i > -1; i--){ 
     k = digits[i]; 
     if(k <= '9' && k >= '0'){ 
      x = (int)k - '0'; 
     } 
     else{ 
      x = (int)k - 'a' + 10; 

     } 
     num = num + (x*pow); 
     pow = pow * a; 

    } 
    return num; 
} 
//changes number from base 10 to knew base 
// and returns as string 
char * toString(char str[], int num, int b) { 

    int i = 0; 
    char x; 
    int mod = 0; 
    while(0 < num){ 
     mod = num % b; 
     if(mod < 10 && mod > -1){ 
      x = (char)(num + '0'); 
     } 
     else{ 
      x = (char)(num - 10 + 'a'); 
     } 

     str[i] =(int) x; 
     num = num/b; 
    } 
    str[i] = '\0'; 

    int length = i + 1; 
    int j = 0; 
    char *reverse; 
    for(i = length -2; i >= 0; i--){ 

     reverse[i] = str[j]; 
     j++; 
    } 
    reverse[length-1] = '\0'; 
    return reverse; 
} 



int main(int argc, char *argv[]) { 
    int i; 
    int num; 
    int a; 
    int b; 
    char str[33]; //binary could be up to 32 + '\0' 
    a = makeInt(argv[0]); //input base 
    b = makeInt(argv[1]);; //output base 
    printf("make int worked and input works"); 
    num = 0; 
    i = 2; 
    while (i < argc) { 
     num = makeBase10(argv[i], a); 
     printf("%s\n", toString(str, num, b)); 
      i++; 
    } 


} 
+0

デバッグはどうですか?いくつかのプリントを追加して、プログラムがクラッシュするまでの距離を調べます。どんなビットクラッシュが起きているのかを把握し、問題を把握することができます。 – John3136

+0

私は逆のポインタもよく見ています。 – nfproductions

+0

私はmainの最初の行にprintfステートメントを置くことはできません。このコードをどのようにフォーマットしたのかは間違いでなければなりません...正直なところ私はこの言語に慣れていません。どのように進めるかを確かめる。 – Graham

答えて

0

charが[0]は常にあなたが実行したプログラムの名前であることをARGVからセグメント・フォールト、一部につながる可能性がある任意のメモリを割り当てられていない、あなたがのためにARGV [1]以降を使用する必要がありますあなたの入力

+0

常にそうとは限りません。 http://stackoverflow.com/questions/2050961/is-argv0-name-of-executable-an-accepted-standard-or-just-a-common-conventi – ktbiz

+0

スーパーヘルプ!ありがとうございました – Graham

1

初期化されていないポインタを使用しています。

int length = i + 1; 
int j = 0; 
char *reverse; // here is the problem 
for(i = length -2; i >= 0; i--){ 

    reverse[i] = str[j]; 
    j++; 
} 
reverse[length-1] = '\0'; 

初期化されていないポインタを使用すると、その変数に格納されるメモリアドレスに書き込むことになります。元気な価値は与えられていない。したがって、書き込むアプリケーション用ではないメモリ位置に書き込んでいます。コンピュータメモリはセグメント化されている。メモリの各領域には所有者がいて、そこに書き込むことができます。セキュリティ上の予防措置であり、バグがシステム内で混乱するのを防ぎます。

char reverse[MAX_SIZE]; 

P.S.を: あなたはコンパイル時に知っていれば、どちらかmalloc

char *reverse = malloc(length); 

または最大サイズはあなたが行うことができます最初に初期化する必要があります逆にするには、最初の半分まで文字列全体をトラバースしないでください。代わりにfor(i = length -2; i >= 0; i--)
書き込み:for(i = length -2; i >= length/2; i--)

+0

ありがとう!私は今、printfステートメントを使ってデバッグすることができます....私はもはやセグメンテーションフォールトを持っていません! – Graham

関連する問題