2017-06-15 30 views
0

だから私は、以下のこのコードは、私のコードでは、私は、構造体の配列に映画の束をロードし、今私は問題[x]は、ここで (のstrcpy(部品が起こっている知っています。評価、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

はい、#と他のすべての必要なライブラリを含めました。 –

+0

構造内に配列がありません!ポインタは**配列ではありません**! – Olaf

+0

'parts [x] .name'はポインタですが、それは何を指していますか? –

答えて

1

主な問題は、コピーする文字列のターゲットメモリを予約しないことです。 struct movies -object文字値の配列へのポインタを格納することを可能にするが、文字はthemselfes値ないデータメンバnameを提供することに留意されたいです。したがって、strcpy(parts[x].name,sp)は、(それ自体で既にUBである)(初期化されていない)ポインタparts[0].nameにアクセスします。ポインタはおそらく "どこか"を指していて、文字列を "どこか"にコピーします。

だからstrcpyを呼び出す前に、まずmallocを使用する必要があると思います。

sp=strtok(line,","); 
    parts[x].name = malloc(strlen(sp)+1); 
    strcpy(parts[x].name,sp);  

か:またはあなたは1回の呼び出しでmallocstrcpyを行いstrdup、使用することができます

さらに
sp=strtok(line,","); 
    parts[x].name = strdup(sp); 

strtokは、実際に、例えば、有効な何かを返した場合、あなたは確認する必要がありますlike:

if ((sp=strtok(line,",")) == NULL) 
     continue; 
    parts[x].name = strdup(sp); 
+0

ありがとうございました!私は1つか2つではなく、スタックオーバーフローからの複数の例を見ましたが、解決策を見つけることができませんでした!今私は文字列をコピーする前にメモリを割り当てる必要があることを理解! –

0

は、あなたがそれを使用する前に、[X] .rating部品ををmallocする必要はありません、私はCと遊んだので、しばらくして、しかし?同じことパーツ[X] .nameのと、他のcharポインタをあなたと持っている。