2017-01-26 4 views
-1
#include <stdio.h> 
#include <fcntl.h> 
#include <errno.h> 
#include <unistd.h> 
#include <string.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <limits.h> 

versucht Felder in meine Struktur zu setzen, aber Segmentierungsfehler bekommen, wenn ich sie strcpy inwarum bin ich Segmentierungsfehler mit strcpy bekommen()

typedef struct country { 
    char code_name[3]; 
    char name[44]; 
    int population; 
    float life_expect; 
}country[244]; 

country *data; 

int main(void) { 


    char c; 
    char *ptr; 
    int i; 
    int temp; 
    char buf[512]; 
    char *token; 

    FILE *fptr; 
    fptr = fopen("AllCountries.dat", "r"); 

hier, wo ich strcpy(data[i]->code_name, token) nennen erhalte ich eine Segmentierung fualt . Warum das? Was mache ich falsch?

do { 
     if (fgets(buf, 512 , fptr)){ 
      //printf("%s\n",buf); 
      token = strtok(buf,","); 
      while (token != NULL){   
      token = strtok(NULL, ","); 
       if (temp == 0){ 
       strcpy(data[i]->code_name, token); 
       printf("%s, ",token); 
       } temp = temp + 1; 
      //printf("%s, ",token); 
      //printf("code_name: %s\n", data->code_name);     
      } 
     i++; 
     temp = 0; 
     } 

    }while ((feof(fptr)) != EOF); 
    fclose(fptr); 
    return 0; 
} 

die Datei

115,DZA,Algeria,Africa,Northern Africa,2381741,1962,31471000,69.7,49982,Al-Jazair/Algérie,Republic,Abdelaziz Bouteflika,35,DZ 
146,AGO,Angola,Africa,Central Africa,1246700,1975,12878000,38.3,6648,Angola,Republic,José Eduardo dos Santos,56,AO 
94,BEN,Benin,Africa,Western Africa,112622,1960,6097000,50.2,2357,Bénin,Republic,Mathieu Kérékou,187,BJ 
129,BWA,Botswana,Africa,Southern Africa,581730,1966,1622000,39.3,4834,Botswana,Republic,Festus G. Mogae,204,BW 
193,IOT,British Indian Ocean Territory,Africa,Eastern Africa,78,NULL,0,NULL,0,British Indian Ocean Territory,Dependent Territory of the UK,Elisabeth II,NULL,IO 
95,BFA,Burkina Faso,Africa,Western Africa,274000,1960,11937000,46.7,2425,Burkina Faso,Republic,Blaise Compaoré,549,BF 
+3

Wo Sie Speicher zugewiesen hat für 'data'? – Barmar

+0

braucht es nicht die Zuweisung für Land? oder liege ich falsch – jhowe

+1

Es gibt keine Zuweisung für 'Land'. Es ist eine Typdefinition, keine Variable. – Barmar

Antwort

2

Sie erklärt eine Zeigervariable data, aber es nie zu jedem Speicher-zu-Punkt zugewiesen. Sie müssen dies tun, in main():

data = malloc(sizeof(*data)); 

Aber es gibt keine wirkliche Notwendigkeit für einen Zeiger hier erklären, nur eine gewöhnliche Variable:

country data; 

Eigentlich, schlage ich vor, dass Sie nicht das Array setzen Sie Dimension in der Typdefinition. Sie sollten den Strukturtyp deklarieren und dann ein Array von Strukturen deklarieren.

typedef struct country { 
    char code_name[3]; 
    char name[44]; 
    int population; 
    float life_expect; 
} country; 

country data[244]; 

Wenn Sie noch einen Zeiger anstelle einem normalen Variable verwenden wollen, es sei:

country *data; 

dann in main() Sie tun würden:

data = malloc(244 * sizeof(*data)); 

Sie müssen auch initialisieren i:

int i = 0; 

und

}while ((feof(fptr)) != EOF); 

ist falsch. feof() gibt 1 zurück, wenn EOF erreicht ist, nicht EOF. Es sollte sein:

} while (!feof(fptr)); 
+0

danke! das funktionierte nicht, was ich falsch gemacht habe – jhowe

+1

@jhowe Du kopierst jedes Feld der Datei in das Feld 'code_name', aber da es' char [3] 'deklariert ist, kann es nur 2 Zeichen enthalten (das dritte Byte ist für den Null-Terminator). Sie schreiben also außerhalb der Grenzen des Arrays, was ein undefiniertes Verhalten ist. – Barmar

+0

schnelle Frage Wie übertrage ich eine ganze Zahl von der Datei zu Population in der Struktur versuchte ich dies: data [i] .population = atoi (Token); \t \t \t \t strcpy (Daten [i] .population, Token); aber es hat nicht funktioniert – jhowe

Verwandte Themen