【问题标题】:strcat error reading csv file from a structstrcat 错误从结构中读取 csv 文件
【发布时间】:2013-09-24 10:39:50
【问题描述】:

我得到的错误导航到 strcat.asm 文件并在主循环入口处设置了一个断点。我创建的 readFile 方法在此 strlen 循环中对字符串进行标记之前中断:

while( !feof(fptr) )
    {
        fgets(oneLine, CONTACT_MAX, fptr); // process the next line to be tokenized
        if (oneLine[strlen(oneLine) - 1] == '\n')
        {

            oneLine[strlen(oneLine) - 1] = '\0';
        }
        sn = strtok(oneLine, " , ");
        fn = sn ? strtok(NULL, " , ") : NULL;
        ph = fn ? strtok(NULL, " , ") : NULL;
        co = ph ? strtok(NULL, " , ") : NULL;

有人知道我在哪里出错了吗?

我的 readFile() 如下:

struct contact *readFile( struct contact *ptrList)
{
    struct contact *head = NULL;
    struct contact *newContact;
    FILE *fptr;
    char oneLine[CONTACT_MAX];
    char *sn, *fn, *ph, *co;
    head = ptrList;



    //open test.csv to be read
    fptr = fopen("test.csv", "r");

    if( fptr == NULL )
    {
        printf("\nCouldn't open %s...", "test.csv");
        return(ptrList);
    }
    fgets(oneLine, CONTACT_MAX, fptr);

    while( !feof(fptr) )
    {
        fgets(oneLine, CONTACT_MAX, fptr); // process the next line to be tokenized
        if (oneLine[strlen(oneLine) - 1] == '\n')
        {
            oneLine[strlen(oneLine) - 1] = '\0';
        }
        sn = strtok(oneLine, " , ");
        fn = sn ? strtok(NULL, " , ") : NULL;
        ph = fn ? strtok(NULL, " , ") : NULL;
        co = ph ? strtok(NULL, " , ") : NULL;

        if ( head == NULL )
        {
            head = (struct contact *)malloc(sizeof(struct contact));
            ptrList = head;
                strcpy(head->fName,fn);
                strcpy(head->sName,sn);
                strcpy(head->phone,ph);
                strcpy(head->company,co);

            head->prev = NULL;
            head->next = NULL;

        }
        else
        {
            newContact = (struct contact *)malloc(sizeof(struct contact));
            head->next = newContact;
            newContact->prev = head;
            newContact->next = NULL;

            strcpy(newContact->fName, fn);
            strcpy(newContact->sName, sn);
            strcpy(newContact->phone, ph);
            strcpy(newContact->company, co);

            head = newContact;
        } // end of (ptrList == NULL)

    } // end of while( !feof(fptr))
    fclose(fptr);
    return(ptrList);
}

文件的格式是这样的:

姓、名、号码、公司

建造者,鲍勃,1234567,鲍勃的

未知,独家新闻,8765645,鲍勃的

【问题讨论】:

  • 没有检查你的代码,但是从你的描述中暗示它可能是一个非 0 终止的字符串,这会造成问题,不是吗?
  • 您对 strtok 的第一次调用是否有一个 NULL 指针作为参数?还是您的主要代码避免了这种情况?

标签: c csv struct strcat


【解决方案1】:
head = (struct contact *)malloc(sizeof(struct contact));
            ptrList = head;
                strcpy(head->fName,fn);
                strcpy(head->sName,sn);
                strcpy(head->phone,ph);
                strcpy(head->company,co);

您在没有 head 的成员已初始化的情况下取消引用 head,这是未定义的行为,可能会导致您的错误,因为 strcpy 期待 \0 终止的数组。但是由于你还没有初始化 head 的成员,你无法知道它们是否被终止。即使它们是,strcpy() 必须读取以检查\0 的问题是它尚未初始化,strcp() 无论如何都在读取未初始化的内存。

最后是标准报价:

J.2 未定义的行为

1 在以下情况下行为未定义:

[..]

使用malloc函数分配的对象的值(7.20.3.3)。

所以一个解决方案是 memset() 转到 0 这样内存块将在任何地方终止,只要您不覆盖它。

【讨论】:

  • 不仅如此,在'newContact'分支中也是同样的错误。
  • 那么我应该将head 初始化为什么呢?
  • @Brian J 我也在问自己......
  • 没问题,我现在知道取消引用会导致未定义的行为,但我很好奇应该将头初始化为什么,以便更好地理解错误的原因。跨度>
  • @Brian J 看起来编辑,现在我明白了我的想法试图告诉我什么;)
猜你喜欢
  • 2018-10-15
  • 1970-01-01
  • 2012-06-17
  • 2015-04-06
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
  • 2018-07-06
  • 1970-01-01
相关资源
最近更新 更多