2017-06-15 4 views
0

Also habe ich diesen Code unten, in meinem Code ich eine Reihe von Filmen in ein Array von Strukturen laden, Jetzt weiß ich das Problem passiert hier (strcpy (Teile [x]. rating, sp) und wie es aussieht, funktioniert der strcpy nicht richtig, kann mir irgendjemand einen Hinweis oder etwas nützliches geben, das ich benutzen kann, um das Problem zu lösen? Ich habe es ohne strcpy versucht, aber es funktioniert auch nicht!Kopieren einer Zeichenfolge in ein Struktur-Array

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

und ja ich habe #include und alle anderen notwendigen Bibliotheken. –

+0

Es gibt kein Array in Ihrer Struktur! Ein Zeiger ist ** nicht ** ein Array! – Olaf

+0

Gegeben 'Teile [x] .name' ist ein Zeiger, worauf zeigt es? –

Antwort

1

Das Hauptproblem besteht darin, dass Sie keinen Zielspeicher für die Zeichenfolge reservieren, die Sie kopieren möchten. Beachten Sie, dass ein struct movies -Objekt einen Datenmember name bietet, der es ermöglicht, einen Zeiger auf eine Folge von Zeichenwerten, aber nicht die Zeichenwerte selbst zu speichern. Daher greift auf den (nicht initialisierten) Zeiger parts[0].name zu (der bereits selbst UB ist); Der Zeiger zeigt wahrscheinlich auf "irgendwo", und dann kopieren Sie eine Zeichenfolge nach "irgendwo".

Sie müssten also zuerst malloc verwenden, bevor Sie strcpy anrufen; oder Sie strdup verwenden könnte, was tut malloc und strcpy in einem Aufruf:

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

oder:

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

Des Weiteren sollten Sie überprüfen, ob strtok tatsächlich etwas gültig zurückgegeben, z.B. wie:

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

Vielen Dank, es hat funktioniert! Ich habe mir nicht ein oder zwei angeschaut, sondern mehrere Beispiele vom Stack-Overflow aber konnte keine Lösung finden! Jetzt verstehe ich, dass ich den Speicher vor dem Kopieren der Zeichenfolge zuordnen muss! –

0

eine Weile her, seit ich mit C gespielt, aber nicht Sie Teile malloc müssen [x] .rating, bevor es? das Gleiche gilt für Teile [x] .name und jedem anderen char Zeiger Sie verwenden haben

Verwandte Themen