3

ファイルから電話帳プログラムに情報を読み込んで連絡先リストから表示しようとすると、最初に表示しようとするとリストが空白になりますが、もう一度確認すると、ファイルの内容が表示されます。 。さらに奇妙なことに、プログラムを介して名前を追加すると、その名前はファイルデータと一緒に一度表示されますが、もう一度確認すると、新しい名前は消えてしまいます。名前を削除すると一度削除されますが、連絡先リストをもう一度確認すると名前が戻ってきます。私は途方に暮れています。これが私の読み取り機能と私の印刷機能です。

void file2(fr*friends ,int* counter, int i,char buffer[],FILE*read,char user_entry3[])
{
    int len;
    fr temp;
    *counter=0;
    i=0; 
    fseek(read, 0, SEEK_SET);  
    while (fgets(buffer, 80, read) != NULL) { 
        temp.First_Name=malloc(36); //was j+1
        temp.Last_Name=malloc(36); //strlen(buffer));

        sscanf(buffer,"%s %s",temp.First_Name,temp.Last_Name);

        fgets(buffer, 20, read);
        len=strlen(buffer);
        if(buffer[len-1]=='\n')
            buffer[len-1]='\0';

        temp.home=malloc(20); //len);
        strcpy(temp.home, buffer);

        fgets(buffer, 20, read);
        len=strlen(buffer);
        if(buffer[len-1]=='\n')
            buffer[len-1]='\0';


        temp.cell=malloc(20); //len);
        strcpy(temp.cell, buffer); 

        friends[i].First_Name=malloc(MAXNAME);
        friends[i].Last_Name=malloc(MAXNAME);
        friends[i].home=malloc(MAXPHONE);
        friends[i].cell=malloc(MAXPHONE);

        if(!friends[i].First_Name || !friends[i].Last_Name || !friends[i].home || !friends[i].cell) {
            printf("\nmalloc() failed!\n");
            getchar();
            return;
        }

        strcpy(friends[*counter].First_Name,temp.First_Name);
        strcpy(friends[*counter].Last_Name,temp.Last_Name);
        strcpy(friends[*counter].home,temp.home);
        strcpy(friends[*counter].cell,temp.cell);


        (*counter)++;
        i++; 

    }
    //fclose(read);
    free(temp.Last_Name);
    free(temp.First_Name);
    free(temp.home);
    free(temp.cell);
}


void print_contact(fr*friends ,int* counter, int i,char buffer[],char    user_entry3[50],FILE*read) {

    for( i = 0; i < *counter; i++)

        if (strlen(friends[i].First_Name) && strlen(friends[i].Last_Name)&&     strlen(friends[i].home)&& strlen(friends[i].cell ))
        {

            getFirst(friends, i);
            getLast(friends, i);
            getHome(friends, i);
            getCell(friends, i);



        }
    file2(friends ,counter,i,buffer,read,user_entry3);

}

プログラムが一度は完全に機能するが、その後は完全に機能しないように見えるので、それは奇妙です。

4

1 に答える 1

0

プログラムが一度は完全に機能するが、その後は完全に機能しないように見えるので、それは奇妙です。

私はそれが実際にそれがうまくいったかのようにだけであると思います:

  • friendsどこかに事前に割り当てられていますか?ファイルから入力を読み取り、ファイルiの終わり(またはエラー)までインクリメントし続けるだけです。遅かれ早かれオーバーフローする可能性があります。

  • あなたは80文字を読んでから、それを36文字の2倍にしようとします-それは再び簡単にオーバーフローする可能性があります。それらの80を、いくつかの関数を介して引数として渡されるバッファーに読み込むことは言うまでもありません。ローカル変数を使用しないのはなぜですか。魔法の数は36小さいですか、大きいですか、それとも等しいMAXNAMEですか?なんで?

  • malloc() tempループのすべての反復で、ただしfree()終了後に1回だけ-メモリリーク〜120B/エントリ。

于 2012-11-21T23:50:44.193 に答える