首页 文章

使用strtok,strlen,malloc和fgets基于内容动态分配数组 . C程序[关闭]

提问于
浏览
-1

我必须阅读带有学生名字和姓氏的文本文件 . 根据扭曲的程序要求,名字和姓氏是char POINTERS . 使用fgets读取每一行 . 因此,我在数组结构中有变量char * last_name,char * first_name .

例如:

比尔·克林顿

威廉,盖茨

我需要在运行时使用strlen和strtok指针分配它们的大小...

问题是,如果我使用strtok和strlen来查找名称的长度,那么原始的data_line已经被分解了!有谁知道如何做到这一点?

1 回答

  • 1

    您已经拥有了所有已经命名的主要功能,因此您可以顺利完成任务 .

    名字是char指针是有道理的 . C中没有字符串类型,只是字符数组 . 此外 - 这是令人困惑的 - 数组和指针在C中相关 . 它们不相同,但在许多情况下它们的行为相同 . 考虑一个需要char指针参数的函数可以接受char指针或数组名称(没有索引) . 另外,请注意带索引的数组实际上只是取消引用指向某个地址的指针,索引指示偏移量 .

    因此,如果您需要动态大小的字符串,则必须将其声明为char指针并为其动态分配内存(即malloc) . 在您的情况下,每个名字和姓氏的大小各不相同 - 并且每个名称都有一个指针 - 因此您需要为每个名称指定一个malloc . 使用strlen()仍然是合适的,就像使用带有多个分隔符的strtok()一样 .

    您可能希望查看strtok()的示例 - 它可以(并且将)一次返回一个令牌 . This link在问题和解释性答案之间有一个很好的例子 .

    编辑:更具体地说,这是您在代码中提出的问题的核心:

    获得一个令牌:

    token = strtok(data_line, sep);  // First token on data_line
    

    要么:

    token = strtok(NULL, sep); // Subsequent tokens on data_line
    

    然后,分配内存和存储名字的例子(姓氏完全类似):

    person[i].first_name = malloc(strlen(token) + 1);
    strcpy(person[i].first_name, token);
    

    添加到strlen()结果的值的一个值是为null终止符创建空间 .

    编辑2:而不是使用malloc()和strcpy(),strdup()完成两者并且更可取 .

相关问题