Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-复制到结构中只返回文件每行的最后一个元素_C - Fatal编程技术网

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);