我必须阅读带有学生名字和姓氏的文本文件。根据扭曲的程序要求,名字和姓氏是char POINTERS。 使用fgets读取每一行。 因此,我在数组结构中有变量char * last_name,char * first_name。
例如:
比尔,克林顿 威廉,盖茨我需要在运行时使用strlen和strtok指针分配它们的大小...
问题在于,如果我使用带有strlen的strtok来查找名称的长度,那么原始的data_line已经被分解了! 有谁知道怎么做?
答案 0 :(得分: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()完成两者并且更可取。