2012-11-13 1 views
1

이 프로그램은 배열 (파일에서)과 이름 (first, last, initial)을 012 배열로 취합니다. 그러나 나는 계속 seg 결함을 얻고 나는 왜 그런지 모른다. 내가 한 것은 메모리를 할당 한 다음 줄 수를 얻기 위해 fscanf을 사용하고 '\n''\0'으로 변경하면서 이름을 얻으려면 fgets을 사용하는 것이 었습니다. 그런 다음 strtok을 사용하여 별도의 배열을 토큰으로 가져와 내가 어딘가에서 잘못 될 수 있다고 생각합니다.2 차원 배열의 malloc과 strtok의 사용

편집 : 이제 전달 인수 1 'strcpy'캐스팅없이 정수에서 포인터가 있습니다. 나는 어떻게 나는

그것을 해결거야 이건 내 코드입니다 :

int main (int argc, char *argv[]) 
{ 
    int num; 
    FILE *fp; 
    fp = fopen(argv[1], "r"); 

    fscanf(fp, "%d", &num); 

    int j; 
    char **f, **l, *m; 
    int i = 0; 

    f = (char**) malloc(num * sizeof (char*)) 


    for (i = 0; i < num;i++) 
     ; 
    f[i] = (char*) malloc(num * sizeof (char)); 
    l = (char**)malloc(num*sizeof(char*)); 

    for (i=0; i<num;i++) 


    l[i] = (char*) malloc(num * sizeof (char)); 

    m = (char*) malloc(num*sizeof(char)); 

    read_names(fp, f, l, m, num); 

// sort(fp, num, f, l, m); 
// display(num, ar); 

    for (j = 0; j < num; j++) { 
     free(f[j]); 
     free(l[j]); 
    } 

    free(f); 
    free(l); 
    free(m); 
    fclose(fp); 

    return(0); 
} 

    void read_names (FILE *fp, char **f, char **l, char m,int num) 
    { 
    int i=0; 

    char temp[80]; 


    for (i=0; i<num; i++) 
    { fgets(temp, 80,fp); 
    char *ptr=strtok (temp,","); 
    strcpy(*f[i], ptr); 
    char *ptr1=strtok (temp, " "); 
    strcpy(*l[i], ptr1); 
    char *ptr2=strtok (temp, ". "); 
    strcpy(m[i],ptr2); 
} 

    } 
+5

코드를 올바르게 포맷하십시오. –

+0

성/이름의 각각에는 num 바이트가 할당됩니다. 이름의 길이가 파일에서 읽을 이름의 수와 일치해야합니까? – simonc

+0

또한 segfault를 디버그하는 전략은 segfault가 사라질 때까지 함수에 추가'return'을 넣는 것입니다. 결국 당신은 segfault가 어느 라인에서 발생했는지 대략 알게 될 것입니다. –

답변

1
f=(char**)malloc (num*sizeof(char*)); 
for (i=0; i<num;i++); 
f[i]=(char*)malloc (num*sizeof(char)); 

l=(char**)malloc (num*sizeof(char*)); 
for (i=0; i<num;i++); 
l[i]=(char*)malloc (num*sizeof(char)); 

m=(char*)malloc (num*sizeof(char)); 

당신은 f를 [I], L, L f를 [I] NULL되지 않도록해야한다.

3

for 루프에 문제가 있습니다. 그 아래에 줄을 감싸는 대신 for() 루프를 세미콜론으로 종료합니다. 세미콜론을 제거하거나 더 나은 방법으로 항상 {}을 사용하는 습관을 가지면이 문제가 다시 발생하지 않습니다.

편집 : 코드를 올바르게 들여 쓰기 했습니까? 그저 오류를 발견했을 수도 있습니다.

+0

물론, 중괄호를 사용하면 실제로 for (i = 0; i <5; i ++); {printf ("한 번 실행 \ n"); }'는 여전히 유효하며 여전히 컴파일되며 한 번만 인쇄됩니다. –

+0

네,하지만 당신이 제대로 들여 쓰기를하고 항상 {}을 if/else/while/do 등으로 사용하는 습관을 가지고 있다면, 당신은이 실수를 저 지르지 않을 것입니다. 지저분하게 들여다 보았을 때 방해가되었을 수도 있습니다. 어느 것이 나를 "peber"중 하나에 데려다줍니다. "자유"(또는 컴파일러의 편의?)라는 이름으로 개발자들이 같은 실수를 반복하도록합니다. 체크인 ftw에서 필수 서식 지정 ... –

관련 문제