C-复制到结构中只返回文件每行的最后一个元素
我试图将每一行分割成子字符串,用斜杠分隔,并将它们加载到结构列表中,但它只输入文件每一行的最后一个元素 我的档案:C-复制到结构中只返回文件每行的最后一个元素,c,C,我试图将每一行分割成子字符串,用斜杠分隔,并将它们加载到结构列表中,但它只输入文件每一行的最后一个元素 我的档案: Adam Mickiewicz///Pan Tadeusz/Publisher 1/1833/24.99 儒勒·凡尔纳///80天环游世界/Publisher 1/1904/19.99 Jean-Jacques Sempe/Rene Goscinny//Little Nicholas/出版商2/1963/22.99 我的阅读算法: struct元素 { char*作者[AK]
Adam Mickiewicz///Pan Tadeusz/Publisher 1/1833/24.99
儒勒·凡尔纳///80天环游世界/Publisher 1/1904/19.99
Jean-Jacques Sempe/Rene Goscinny//Little Nicholas/出版商2/1963/22.99
我的阅读算法:
struct元素
{
char*作者[AK];
字符*标题;
char*出版商;
国际年;
浮动价格;
结构元素*next;
};
typedef结构元素书;
字符行[1024];//缓冲器
char*string;//临时字符串
char*found=“/”;
Book*first=NULL;
账簿*当前=空;
while(fgets(line,sizeof(line),fp)){
Book*new=malloc(sizeof(Book));
string=strdup(line);//复制文件中的每一行
//如果遇到分隔符,请将该行切片
while((found=strep(&string,“/”)!=NULL){
对于(i=0;i作者[i]=strdup(已找到);
}
新建->标题=strdup(已找到);
新建->发布服务器=strdup(已找到);
新->年=atoi(strdup(found));
新建->价格=atof(strdup(found));
}
if(first==NULL){
当前=第一个=新的;
}
否则{
当前=当前->下一步=新建;
}
}
输出:
作者:24.99
24.99
24.99
标题:24.99
发行人:24.99
年份:24
价格:24990000
=====================
作者:19.99
19.99
19.99
标题:19.99
发行人:19.99
年份:19
价格:19.990000
=====================
作者:22.99
22.99
22.99
标题:22.99
发行人:22.99
年份:22
价格:2290000
=====================
对不起,如果以前有类似的帖子。任何建议都会有帮助。提前感谢。您的循环:
while ((found = strsep(&string, "/")) != NULL) {
for (i = 0; i < AK; i++) {
new->authors[i] = strdup(found);
}
new->title = strdup(found);
new->publisher = strdup(found);
new->year = atoi(strdup(found));
new->price = atof(strdup(found));
}
NEXT_TOKEN
宏可避免复制粘贴繁琐的strep
代码
也要避免<代码>新< /C> >因为它是C++关键字,只使代码C兼容。< /P>新->YOR= ATOI(STRUP(查找));泄漏。
new->title=strdup(已找到);新建->发布服务器=strdup(已找到);新->年=atoi(strdup(found));新建->价格=atof(strdup(found))代码>因此所有这些字段都具有相同的值found
?请注意,数据比代码更重要。什么是“book”类型?您在strep上执行while循环,最终找到指向最后一个字段的第一个字符的点。然后将该字段复制到结构的每个成员中。不清楚你期望会发生什么不同。你的“结构列表”在哪里??请注意,new
并不是最好的名称选择。在C中合法,它相当于C++中的代码> MalOC/。看起来令人畏惧和重复,但它很有效!非常感谢你,伙计!
#define NEXT_TOKEN if ((found = strsep(&string, "/")) == NULL) return
for (i = 0; i < AK; i++) {
NEXT_TOKEN;
new->authors[i] = strdup(found);
}
NEXT_TOKEN;
new->title = strdup(found);
NEXT_TOKEN;
new->publisher = strdup(found);
NEXT_TOKEN;
new->year = atoi(found);
NEXT_TOKEN;
new->price = atof(found);