2012-04-13 2 views
0

저는 C를 처음 사용했기 때문에 이해할 수없는 분할 오류가 발생했습니다. I는 엄격 양수의 계수의 개수를 계산하려고 다음 프로그램 가지고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; 
} 

분할 결함 이러한 라인 이후의 정수를 입력하고 입력 된 직후 발생을 주()

printf("Please enter a positive integer n such that n >= 1: "); 
scanf("%d", &number); 

세그멘테이션 오류를 일으키는 부분은 무엇이며 어떻게 피할 수 있습니까?

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 환경으로 FTPing하고 있습니다. – canton

답변

6

요인 1을 나눠 보려면 재귀를 멈추지 않아도됩니다. 그것은 모든 함수 호출이 현재 프로그램 카운터 (현재 서 프로그램의 위치를) 밀어 있기 때문에과 : 그것은 세그먼테이션 폴트 (segfault) 왜

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

내가 말을해야 :

그냥 요인은 1 결코하자 스택 (일명 호출 스택)의 함수 인수. 스택은 함수 호출 및 로컬 변수에 사용되는 상대적으로 작은 메모리 블록입니다.

스택을 너무 세게 밀면 넘어집니다. 게임 끝, 일명 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()'를 사용한다면 – FatalError