2016-10-06 13 views
-1

ベース10の数値を他のベースで同等のものに変換するプログラムを作成していますが、実行しようとするとセグメンテーションフォルトが発生します。whileループ内のセグメンテーションフォールト(C)

これは、これまでのコードです:GDBとプリントステートメントでエラーをチェックを通じて

#include <stdio.h> 

int base; 
int num; 
char* num2[50]; 
int x =0; 

int main(){ 

    printf("Input a number in base 10 and a base (2-16) that you would like to convert to in this format: 100 2\n"); 
    fflush(stdout); 
    scanf("%d%d",&num, &base); 
    printf("%d%d", num, base); fflush(stdout); 

    while ((num % base) > 1){ 
     printf("%d", x); fflush(stdout); 
     if(num % base == 10) 
      num2[x] = "A"; 
     else if (num % base == 11) 
      num2[x] = "B"; 
     else if (num % base == 12) 
      num2[x] = "C"; 
     else if (num % base == 13) 
      num2[x] = "D"; 
     else if (num % base == 14) 
      num2[x] = "E"; 
     else if (num % base == 15) 
      num2[x] = "F"; 
     else 
      *num2[x] = num % base; 

     num = num % base; 
     x++; 
     printf("%d, %s", num, num2[x]); fflush(stdout); 
    } 

    while (x >= 0){ 
     printf("%s", num2[1]); 
     fflush(stdout); 
     x--; 
    } 

    printf("\n"); 
    fflush(stdout); 

    return 0; 
} 

、私はエラーがライン14で何かに由来結論に達しました:

while ((num % base) > 1) { 

私は比較的新しいC言語です。私がやったことのほとんどはJavaにあります。

+0

あなたの診断がマークをたくさん逃しているので、GDBをより使いやすくする方法を学ぶ必要があります。 http://users.ece.utexas.edu/~adnan/gdb-refcard.pdf –

+0

私は学生で、私のクラスでは簡単にしか議論されていません。 refカードをありがとう、それは間違いなく将来便利になるでしょう。 – Root21

答えて

0

これまでの両方の回答が正しい(つまり@Souravと@Tony)。 これら2つの間の正確な理由は、実行インスタンス中に提供される入力に依存します。

  1. あなたの入力はnum = 3、base = 16です。
    次に、あなたのプログラムは、ラインにクラッシュします -
    *num2[x] = num % base;

    からnum2 'num2のは' グローバルな配列であるため、[X] NULLを指します。

  2. あなたの入力はnum = 13、base = 16です。
    次に、あなたのプログラムが行でクラッシュします -
    num2[x] = "D";

    「numが13」で一定(num = num % base)のままで、結果として「x」を最終的に49とnum2[x]を超えた値の方法だろう。これはあります違法な場所にアクセスします。


また、あなたのプログラムは、論理的に欠陥があります。あなたは現在の方法であなたが望む出力を得ることはできません。あなたのプログラムは若干微調整する必要があります -

char num2[50]; /* Array of chars, instead of array of pointers to char. */ 

。 。

/* Add check to verify that base is a value between 2 and 16. */ 

while ((num % base) > 0){ /* Greater than 0, not 1. */ 
    if(num % base == 10) 
     num2[x] = 'A'; /* Use a character instead of a string. */ 
    else if (num % base == 11) 
     num2[x] = 'B'; 
    else if (num % base == 12) 
     num2[x] = 'C'; 
    else if (num % base == 13) 
     num2[x] = 'D'; 
    else if (num % base == 14) 
     num2[x] = 'E'; 
    else if (num % base == 15) 
     num2[x] = 'F'; 
    else 
     num2[x] = (num % base) + '0'; /* Convert the number to its character form. */ 

    num /= base; /* Duh! */ 
    printf("%d, %c", num, num2[x]); fflush(stdout); /* %c instead of %s*/ 
    x++; 
} 

while (x >= 0){ 
    printf("%c", num2[x]); fflush(stdout); /* %c instead of %s*/ 
    x--; 
} 
+0

うわー、ありがとう!私の推論は、私はエラーを修正した後、私は私のロジックを修正するつもりだったので、その後、私はテスト値などを使用することができた – Root21

+0

これはあなたの問題を解決答えを受け入れる場合。オプションでupvote。 –

0

問題、私はそれがelse文の本体である参照として、ここでは

else 
    *num2[x] = num % base; 

は、num[x]はNULLポインタです。あなたはそれを逆参照することはできません。その場所をに保存する前に、num[x]にメモリを割り当てる必要があります。値を入力してください。