所以我在下面有这个代码,在我的代码中我将一堆电影加载到一个结构数组中,现在我知道问题发生在这里 (strcpy(parts [x] .rating,sp);以及strcpy看起来不能正常工作,有人可以给我一些提示或者有用的东西我可以用来解决这个问题吗?我试过没有使用strcpy但它也不起作用!
struct movies
{
char *name;
char *rating;
int time;
float rtwo,rone,rthree;
};
void displayData(movies *);
main ()
{
struct movies parts[6];
FILE *fp;
char line[100];
fp=fopen("movies.csv","r");
if (fp == NULL)
{
printf("Could not locate file");
exit(0);
}
char *sp;
int x = 0;
while (fgets(line,100,fp)!=NULL)
{
sp=strtok(line,",");
strcpy(parts[x].name,sp);
sp=strtok(NULL,",");
strcpy(parts[x].rating,sp);
sp=strtok(NULL,",");
sscanf(sp,"%d", &parts[x].time);
sp=strtok(NULL,",");
sscanf(sp,"%f", &parts[x].rone);
sp=strtok(NULL,",");
sscanf(sp,"%f", &parts[x].rtwo);
sp=strtok(NULL,",");
sscanf(sp,"%f", &parts[x].rthree);
++x;
}
fclose(fp);
displayData(parts);
return 0;
}
void displayData(movies *parts)
{
for (int x=0; x < 6 ; ++x)
{
printf("\n Name: %s RATED: %s Time:%d crit: %.1f crit: %.1f crit:
%.0f",parts[x].name,parts[x].rating,parts[x]
.time,parts[x].rone,parts[x].rtwo,pa
rts[x].rthree);
}
}
答案 0 :(得分:1)
主要问题是您没有为要复制的字符串保留目标内存。请注意,struct movies
- 对象提供了一个数据成员name
,它允许存储指向一系列字符值的指针,但不能存储自己的字符值。因此,strcpy(parts[x].name,sp)
访问(未初始化的)指针parts[0].name
(它本身已经是UB);指针可能指向&#34;某处&#34;,然后将字符串复制到&#34;某处&#34;。
因此,在调用malloc
之前,您必须先使用strcpy
;或者你可以使用strdup
,在一次通话中malloc
和strcpy
:
sp=strtok(line,",");
parts[x].name = malloc(strlen(sp)+1);
strcpy(parts[x].name,sp);
或:
sp=strtok(line,",");
parts[x].name = strdup(sp);
此外,您应该检查strtok
是否确实返回了有效的内容,例如像:
if ((sp=strtok(line,",")) == NULL)
continue;
parts[x].name = strdup(sp);
答案 1 :(得分:0)
自从我玩C之后已经有一段时间了,但是,在使用它之前,你不需要malloc部件[x] .rating吗?与[x] .name和你拥有的任何其他字符指针相同。