我必须阅读带有学生名字和姓氏的文本文件 . 根据扭曲的程序要求,名字和姓氏是char POINTERS . 使用fgets读取每一行 . 因此,我在数组结构中有变量char * last_name,char * first_name .
例如:
比尔·克林顿
威廉,盖茨
我需要在运行时使用strlen和strtok指针分配它们的大小...
问题是,如果我使用strtok和strlen来查找名称的长度,那么原始的data_line已经被分解了!有谁知道如何做到这一点?
您已经拥有了所有已经命名的主要功能,因此您可以顺利完成任务 .
名字是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()完成两者并且更可取 .
1 回答
您已经拥有了所有已经命名的主要功能,因此您可以顺利完成任务 .
名字是char指针是有道理的 . C中没有字符串类型,只是字符数组 . 此外 - 这是令人困惑的 - 数组和指针在C中相关 . 它们不相同,但在许多情况下它们的行为相同 . 考虑一个需要char指针参数的函数可以接受char指针或数组名称(没有索引) . 另外,请注意带索引的数组实际上只是取消引用指向某个地址的指针,索引指示偏移量 .
因此,如果您需要动态大小的字符串,则必须将其声明为char指针并为其动态分配内存(即malloc) . 在您的情况下,每个名字和姓氏的大小各不相同 - 并且每个名称都有一个指针 - 因此您需要为每个名称指定一个malloc . 使用strlen()仍然是合适的,就像使用带有多个分隔符的strtok()一样 .
您可能希望查看strtok()的示例 - 它可以(并且将)一次返回一个令牌 . This link在问题和解释性答案之间有一个很好的例子 .
编辑:更具体地说,这是您在代码中提出的问题的核心:
获得一个令牌:
要么:
然后,分配内存和存储名字的例子(姓氏完全类似):
添加到strlen()结果的值的一个值是为null终止符创建空间 .
编辑2:而不是使用malloc()和strcpy(),strdup()完成两者并且更可取 .