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()在完成后只有一次 - 泄漏内存 ~120B/entry;

于 2012-11-21T23:50:44.193 回答