gpt4 book ai didi

c - 制作通用函数将项目加载到链接列表中

转载 作者:行者123 更新时间:2023-11-30 17:29:36 24 4
gpt4 key购买 nike

好的,这里是初级 C 程序员。我试图做的是创建一个从文本文件填充链接列表的函数。到目前为止,我所做的是使用 fgets() 和 strtok() 迭代文本文件,并且我尝试将标记化字符串加载到函数中以填充链接列表。首先,当我使用 strtok 时,如何将标记化字符串捕获到 char 数组或字符串中?到目前为止,我已经尝试过这样的事情:

char catID[ID_LEN+1];
char drinkType[1];
char itemName[MAX_NAME_LEN + 1];

while((fgets(line, sizeof(line), menufile)) != NULL) {
token = strtok(line, "|");
strcpy(data,strdup(token));
addCatNode(menu, catID);
printf("%s\n", catID);
i++;
while(token){

if(token)
{
strcpy(drinkType,strdup(token));
addNodeItem(&menu, drinkType);
strcpy(itemName,strdup(token));
addNodeItem(&menu, itemName);
token = strtok(NULL, "|");

}

}
}

但不知何故,我认为这不是正确的方法。当然,当我尝试将数据加载到 addNodeItem() 函数中时,我的原型(prototype)如下所示:

void addNodeItem(BCSType* menu, char *nodeitem);

并尝试使用以下表示法添加项目:

category->nodeitem

编译器告诉我结构中没有名为“nodeitem”的成员。当然没有,但我试图从 strtok() 部分加载名称,那么如何让 addNodeItem() 函数识别我试图传递给它的名称呢?这里很困惑。

链表中的“category”结构如下所示:

typedef struct category
{
char categoryID[ID_LEN + 1];
char categoryName[MAX_NAME_LEN + 1];
char drinkType; /* (H)ot or (C)old. */
char categoryDescription[MAX_DESC_LEN + 1];
CategoryTypePtr nextCategory;
ItemTypePtr headItem;
unsigned numItems;
} CategoryType;

最佳答案

这里有几个问题,但对于初学者来说,strcpy(drinkType, strdup(token)) 没有多大意义。

token 是指向输入字符串一部分的指针,带有“|”分隔符替换为 NULL。
strdup 分配 strlen(token) 的内存并复制 token 的内容。到目前为止,一切都很好。它返回新内存的地址,您不会将其存储在任何地方,因此您永远无法free()它。这是一个泄漏,您最终可能会耗尽内存。

strcpy(drinkType,strdup(token)) 将新内存复制到 drinkType 指向的内存中。那只有 1 个字符。我不知道这是否足够大。您也不会,因为您正在加载的文件中可能有任何内容。这是一个等待发生的错误。

然后似乎 addNodeItem() 函数缺少一些东西。您传递的值代表结构中可能的值之一,但无法指定是哪一个。您可能会更幸运地创建 CategoryType 的本地副本,分配来自分词器的所有信息,然后将整个内容复制到新节点中。

算法概要:

while lines:
CategoryType newCat
tokenize line
copy tokens into correct members of newCat, using `strncpy` to ensure no overruns.
add newCat to linked List.

对于最后一步,您需要在添加之前复制newCat,因为当您处理下一行时它会被覆盖。您可以将副本传递给 AddNodeItem,或者让 AddNodeItem 制作副本。 (还有其他选项,但这些可能是最简单的。)

关于c - 制作通用函数将项目加载到链接列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25577570/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com