使用指针传递struct时未声明的标识符

时间:2013-04-24 10:26:24

标签: c pointers struct readline stringtokenizer

我有以下方法将文件读入结构体,但是,当curr变量为空时,程序在进入写文件方法时会发生轰炸。

我在变量被标记化时添加了一个空检查但是,它在那时没有抛出错误。我猜它与我将数据复制到newContact的方式有关,但是我无法看到我搞砸了。

这是提到的方法,读取文件标记变量并添加newContact

struct contact *readFile(char * FName,struct contact** ptrList)
{    
    struct contact *head, *newContact;
    FILE *fptr;
    char oneLine[60];
    char *sname, *fname, *phone,*company, *email;

    head = *ptrList;

    fptr = fopen(FName,"r");

    if(fptr == NULL)
    {
        printf("\nCant open file!");
        return(ptrList);    
    }
    fgets(oneLine, 55, fptr);
    while(!feof(fptr))
    {
        fgets(oneLine, 55, fptr);
        if(oneLine[strlen(oneLine)-1] == '\n')
        {
            oneLine[strlen(oneLine)-1] = '\0';    
        }

        // open file and other stuff
        if(!ptrList) return; // invalid pointer
        for(head=*ptrList;head&&head->next;head=head->next);
        while( ReadLine(fptr,oneLine) )
        {
            //check that variables aren't empty here:
            if(sname == NULL || fname == NULL)
            {
                printf("\nvariable empty!");
                //return(ptrList);
            }
            sname = strtok(oneLine,",");
            fname = strtok(NULL,",");
            phone = strtok(NULL,",");
            company = strtok(NULL,",");
            email = strtok(NULL,",");

            newContact = (struct contact *)malloc(sizeof(struct contact));
            if(!newContact) break; // out of memory
            newContact->prev = head;
            newContact->next = 0;

            //copy the data to the new one
            strcpy(newContact->sname,sname);
            strcpy(newContact->fname,fname);
            strcpy(newContact->phone,phone);
            strcpy(newContact->company,company);
            strcpy(newContact->email,email);

            head = newContact;
            if(!*ptrList) *ptrList = head; // see: point 2
        }
    }

这是struct声明:

struct contact {
    char sname[15];
    char fname[15];
    char phone[15];
    char company[15];
    char email[15];
    struct contact *prev;
    struct contact *next;
};

我在ReadLine处也收到了一个未定义的错误。我是否应该为此功能导入一个库(因为我在搜索中看不到任何内容)?

while( ReadLine(fptr,oneLine) )

此处出现新错误:

head = *ptrList;

关于它为什么轰炸的任何想法?

1 个答案:

答案 0 :(得分:0)

head = newContact;
if(!*ptrList) *ptrList = head; // see: point 2

我相信,你已经在列表的最后了。 我不认为需要这个'if'声明。我们永远不会改变列表的实际“头部”,这就是'ptrList'指向的地方。

另外,你不想在第一次循环之外使用下面的'for'循环吗? 代码试图从文件中读取并添加到列表的末尾。 我没有看到需要遍历每行文件的循环。

 for(head=*ptrList;head&&head->next;head=head->next);