이 프로그램은 배열 (파일에서)과 이름 (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);
}
}
코드를 올바르게 포맷하십시오. –
성/이름의 각각에는 num 바이트가 할당됩니다. 이름의 길이가 파일에서 읽을 이름의 수와 일치해야합니까? – simonc
또한 segfault를 디버그하는 전략은 segfault가 사라질 때까지 함수에 추가'return'을 넣는 것입니다. 결국 당신은 segfault가 어느 라인에서 발생했는지 대략 알게 될 것입니다. –