【发布时间】:2016-10-12 02:05:36
【问题描述】:
为了更好地解释它,我有一个结构“用户”,其中包含用户 ID、他们的姓名和一个包含他们朋友 ID 的数组。循环读取一个文件作为输入,其中每一行都包含有关用户的信息,在此模型中:“ID;name;friendsID”,并且用户可能有多个朋友(在本例中为“ID;name;friendID1 ;...;friendIDx")。
我试图读取每个用户的每一行,计算有多少“;”需要知道用户有多少朋友,并使用 strtok 获取用户 ID、姓名和朋友的 ID。一切正常,除了名字。它正确读取了每个名称,但不知何故,吃掉了循环的结尾,每个用户都有相同的名称,读取的姓氏。
如果它在循环内正确读取和归属名称字符串,我不知道为什么会这样做。
这是我目前所得到的:
typedef struct user {
int ID;
char* name;
int* friendsID;
};
// declaring variables, declaring user array, opening file, allocating memory, etc.
for(i = 0; i < num_users; i++){
fgets(line, sizeof(line), input); // Reads a line
for(j = 0, user_friends = 0; line[j]; j++) { // Counts how many friends the user has
user_friends += (line[j] == ';');
}
user[i].ID = atoi(strtok(line, ";")); // Reads the ID
user[i].name = strtok(NULL, ";"); // Reads the name
for(k = 0; k < user_friends - 1; k++) { // Reads the friend's IDs
user[i].friendsID[k] = atoi(strtok(NULL, ";"));
}
}
最后,我得到了所有正确的 ID 和朋友的 ID,但名字都一样。
【问题讨论】:
-
更多代码,包括类型定义,会有所帮助...
-
line会在每次调用fgets时被覆盖。由于user[i].name是指向line中的标记的指针,因此它们都将指向最后读取的line。 (如果ID的长度不同,那么它们将指向最后一行的不同部分) -
我打赌
user[i].name不是字符串。user[i].name的类型是什么? -
哦,现在说得通了。所以我每次都必须使用不同的“线”,然后呢?
-
或者至少
user[i].name = strdup (strtok(NULL, ";"));(你将负责freeing 每个user[i].name使用相同的line没有错,你只需要复制到保留每个user[i].name。您还必须分配给friendsID[k]