2012-04-13 11 views
0

私はC言語を新しくしており、理解できないセグメンテーションフォルトが発生しています。 )セグメンテーション障害が直ちに整数を入力した後に発生CのセグメンテーションフォールトPrintf()とScanf()

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

int numberOfFactors (int number, int factor) { 
    if (number % factor == 0) { 
     number = number/factor; 
     return numberOfFactors(number, factor) + 1; 
    } else { 
     return 0; 
    } 
} 

int check (int x) { 
    if (x>0) { 
     return 1; 
    } else { 
     return 0; 
    } 
} 

int main(void) { 
    int number; 
    printf("Please enter a positive integer n such that n >= 1: "); 
    scanf("%d", &number); 
    if (check(number)){ 
     int i; 
     for (i=1; i<=number; i++) { 
      int factors; 
      factors = numberOfFactors(number, i); 
      printf("%d^%d ", i, factors); 
     } 
    } 
    return 0; 
} 

と(主にこれらの行の後にENTER:

printf("Please enter a positive integer n such that n >= 1: "); 
scanf("%d", &number); 
Iは厳密に正の数の要素の数を計算しようとし、次のプログラムを有しています

これらの行のどの部分がセグメンテーション違反を引き起こしていますか?それを避けるにはどうすればよいですか?

int numberOfFactors (int number, int factor) { 
    if (number % factor == 0) { 
     number = number/factor; 
     return numberOfFactors(number, factor) + 1; 
    } else { 
     return 0; 
    } 
} 

ような何かにあなたのnumberOfFactorsを変更します:

+3

デバッガで実行しようとしましたか?故障の原因となっている正確な線で停止する可能性が高いです。 –

+0

いいえ、私は実際にこれをTextWranglerで入力してから、私の学校のLinux環境にFTPしています。 – canton

答えて

6

ファクタ1を除算しようとすると、再帰は停止しません。

ただ、係数が1になることはありませんしましょう:それはセグメンテーション違反なぜ私が言うべき

for (i=2; i<=number; i++) { 
     int factors; 
     factors = numberOfFactors(number, i); 
     printf("%d^%d ", i, factors); 
    } 

:それはですすべての関数呼び出しは、現在のプログラムカウンタ(現在立って、あなたのプログラム内の位置)をプッシュしているためとスタック(別名コールスタック)上の関数の引数。スタックは、関数呼び出しとローカル変数に使用される比較的小さなメモリブロックです。

スタックをあまりにも強く押すと、そのスタックが転倒します。ゲームの終わり、別名segfault;)

0

あなたはおそらく、この再帰に問題持って

if (check(number)){ 
    int i; 
    for (i=1; i<=number; i++) { 
     int factors; 
     factors = numberOfFactors(number, i); 
     printf("%d^%d ", i, factors); 
    } 
} 

何かに:その後、

int numberOfFactors (int number) 
{ 
    int i=1; 
    int ret=0; 
    for(;i<=number;i++) { 
     if (number%i == 0) { 
      ret++; 
     } 
    } 
    return ret; 
} 

とし、この部分を変更しますより簡単に:

if (check(number)){ 
    factors = numberOfFactors(number); 
    printf("%d^%d ", number, factors); 
} 
+0

私はそこに届くとは思っていませんが、そこにprintf文を投げてチェックしています。 – canton

+0

実際には私はmainfのscanfの直後にprintfを投げてしまいました。 – canton

+3

@cantonこれは非常に誤解を招く可能性があります。 'stdout'はデフォルトでバッファされた行です。したがって、プログラムがまだバッファリングされたデータでクラッシュする可能性があります。あなたの最善の策はデバッガですが、 'printf()'を使うつもりならば、文字列を '\ n'または' fflush(stdout);に '' – FatalError

関連する問題