2016-10-06 3 views
-1

10 진수를 다른 기지의 해당하는 10 진수로 변환하는 프로그램을 작성하고 있지만 실행하려고하면 분할 오류가 계속 발생합니다.while 루프의 세그먼트 오류 (C)

이 지금까지 코드 :

while ((num % base) > 1) { 
:

#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; 
} 

gdb를 인쇄 문으로 오류를 확인을 통해, 나는 오류가 라인 14 일에서 유래한다는 결론에 도달했습니다

저는 C에 비교적 익숙합니다. 제가 한 일은 대부분 Java에있었습니다.

+0

당신의 진단이 마크를 많이 놓치기 때문에 GDB를 더 잘 사용하는 법을 배워야합니다. http://users.ece.utexas.edu/~adnan/gdb-refcard.pdf –

+0

나는 학생이며 수업에서 만 간략하게 논의되었다. 심판 카드를 보내 주셔서 감사합니다. 장래에 반드시 도움이 될 것입니다. – Root21

답변

0

두 가지 이전 답변이 맞습니다 (즉 @Sourav 및 @Tony). 이들 중 정확한 이유는 실행 인스턴스 중에 제공된 입력에 따라 다릅니다.

  1. 귀하의 의견은 num = 3, base = 16입니다.
    그런 다음 프로그램은 줄에서 충돌합니다 -
    *num2[x] = num % base;

    NUM2을 [X] 포인트를 NULL로 'NUM2'는 전역 배열 때문이다.

  2. 입력 한 내용은 num = 13, base = 16입니다. 이 'NUM'은 13 일 (num = num % base)에서 일정하게 유지되기 때문에
    num2[x] = "D";

    그 결과 '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]는 널 포인터이다. 당신은 그것을 역설적으로 해석 할 수 없습니다. 해당 위치를 에 저장하기 전에 num[x]에 메모리를 할당해야합니다. 값을 지정하십시오.