将字符串复制到结构数组中

时间:2017-06-15 22:23:31

标签: c

所以我在下面有这个代码,在我的代码中我将一堆电影加载到一个结构数组中,现在我知道问题发生在这里      (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); 

    }
}

2 个答案:

答案 0 :(得分:1)

主要问题是您没有为要复制的字符串保留目标内存。请注意,struct movies - 对象提供了一个数据成员name,它允许存储指向一系列字符值的指针,但不能存储自己的字符值。因此,strcpy(parts[x].name,sp)访问(未初始化的)指针parts[0].name(它本身已经是UB);指针可能指向&#34;某处&#34;,然后将字符串复制到&#34;某处&#34;。

因此,在调用malloc之前,您必须先使用strcpy;或者你可以使用strdup,在一次通话中mallocstrcpy

    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和你拥有的任何其他字符指针相同。