2017-04-02 4 views
1

Ich bin ein ziemlich interessantes Problem in C gegenüber So habe ich eine Struktur, die wie folgt aussieht:Array von Strukturen - C falscher Wert

struct Question { 
    int year; 
    char* month; 
    char* day; 
    char* hour; 
    char* minute; 
    char* second; 
    char* question; 
    int answerCount; 
    char* answers[1024]; 
} questions[100]; 

Dort habe ich eine Reihe von Frage structs Initialisierung genannt Fragen, mit der Größe von 100
Deshalb möchte ich dieses Array aus einer Datei wie folgt aussehen füllen:

2017 04 01 12 38 00 OK? 2 NO NO 
2017 04 01 14 15 00 WHAT? 4 YES YES YES YES 

die Struktur: Jahr Monat Tag Stunde Minute Sekunde Frage beantwortet Answer

Ich bin der Verarbeitung der Datei wie folgt aus:

... 
int id = 0; 
int j; 

char line[2048]; 
while ((fgets(line, sizeof(line), fp)) != NULL) { 


     char* p = strtok(line, " "); 
     char* tokens[1024]; 
     char* token; 

     int i = 0; 
     int counter = 0; 

     while((p != NULL)) { 
      switch(counter) { 
       case 0: questions[id].year = atoi(p); break; // year 
       case 1: questions[id].month = p; break; // month 
       case 2: questions[id].day = p; break; // day 
       case 3: questions[id].hour =p; break; // hour 
       case 4: questions[id].minute = p; break; // minute 
       case 5: questions[id].second = p; break; // seconds 
       case 6: questions[id].question = p; break; // question 
       case 7: 
       questions[id].answerCount = atoi(p); 
       int qcount = atoi(p); 
       int k; 
       int l = j; 
       //printf("count : %d", qcount); 
       for (k = 0; k < qcount; ++k) { 
        p = strtok(NULL, " "); 
        ++l; 
        questions[id].answers[k] = p; 
       } 
       break; 
       default: break; 
      } 
      p = strtok(NULL, " "); 
      ++counter; 
     } 
     ++id; 

    } 
    fclose(fp); 
... 

Danach, wenn ich die Fragen [0] .question Element in der while-Schleife printf, ich bekommen, aber wenn ich drucken "OK?" das gleiche nach der While-Schleife, bekomme ich "WAS?".
Ich habe viel Zeit damit verbracht nachzudenken, was ich falsch machen könnte, aber keinen Erfolg.
Danke für Ihre Hilfe.

+0

Sie erwarten also die Zeichenfolge "OK?" irgendwo für späteres Drucken gespeichert werden. Woher? –

+0

Gut in Fragen [0]. Frage. Ich mache diese Zuordnung hier: questions [id] .question = p; – Corner

+0

Fragen [0] .Frage ist ein Zeiger. Es kann keine Zeichenfolge speichern, sondern nur auf eine anderweitig gespeicherte Zeichenfolge. –

Antwort

1

In Ihrer Struktur haben Sie viele Zeichenzeiger, für alle zuweisen Sie Zeigerwerte, die von strtok zurückgegeben werden. Sie müssen verstehen, dass der Inhalt von Zeigern, die von strtok zurückgegeben werden, die Überstunden mit jedem Aufruf von strtok ändern und Sie diese Zeiger für zukünftige Verwendung nicht speichern sollen. Beziehen Sie sich auf Mann von strtok.

Sie müssen entweder die char * in Ihrer Struktur char Array oder alloc für diejenigen char * Speicher zu ändern und dann durch strtok, um es den Inhalt des Zeigers zurück kopieren. Andernfalls können Sie am Ende merkwürdiges Verhalten von Ihrem Programm bekommen.

+0

Ohh .. danke für deine Antwort!Verwaltet, um es zu lösen, und verstand das eigentliche Problem hier. Danke Sir! – Corner

+0

Am meisten Willkommen! :) – Jay

2

Dieses:

char* answers[1024]; 

ist ein Array von 1024 Zeiger auf Strings, aber enthält keine Lagerung für die Saiten. Also, wenn Sie das tun:

questions[id].answers[k] = p; 

Sie kopieren nicht die Antwort, sondern nur einen Zeiger darauf zuweisen. Da schließlich ein Zeiger auf irgendwo innerhalb line ist, der nur einmal zugewiesen wird, bevor die Schleife beginnt, überschreiben Sie die Zeichenfolgen in line jedes Mal durch die Schleife. So wird der Referent Ihrer answers geändert.

Sie könnte entweder answers zu ändern, um eine 2D-Array von char zu sein, wobei in diesem Fall die maximale Länge jeder Antwort wird begrenzt sein, oder strdup() oder ähnliches verwenden, um Speicher für jede Antwort zuzuordnen, und free() es am Ende.

+0

Seine Frage ist zum Drucken von Fragen [0] .Frage und Ihre Antwort ist über "Frage.Antworten". Allerdings stimme ich zu, dass Sie einen gültigen Punkt haben. ;) – Jay

+0

Oh danke dafür, aber das war nicht mein ursprüngliches Problem. Danke für deinen Vorschlag, aber ich habe das geändert. – Corner