1

このプログラムはnum、(ファイル内の) 配列と 2 次元配列の名前 (最初、最後、最初) を受け取ることになっています。しかし、セグフォルトが発生し続け、その理由がわかりません。私がしたことは、メモリを割り当ててから、を使用fscanfして行数をfgets取得し、名前を取得しながら、すべて'\n'をに変更することでした'\0'。次に、strtokどこかで間違っている可能性があると思われるトークンに別の配列を取得するために使用します。

編集:今、「strcpy」の引数1を渡すと、キャストなしで整数からポインターが作成されます。どうやって直すんだ

これは私のコードです:

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

    }
4

2 に答える 2

3

for ループに問題があります。それらの下の行を囲む代わりに、 for() ループをセミコロンで終了しています。セミコロンを削除するか、より良い方法として、常に使用する習慣を身につけれ{}、この問題が再び発生することはありません。

編集:コードを適切にインデントしていれば、それだけでエラーを見つけたかもしれません。

于 2012-11-13T09:38:30.003 に答える
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、f[i]、l、l[i] が NULL でないことを確認する必要があります。

于 2012-11-13T09:34:19.990 に答える