2017-01-26 5 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> 

пытаюсь положить поля в мои структуры, но получаю ошибку сегментации, когда я STRCPY их вПочему я получаю ошибку сегментации с зЬгсром()

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"); 

здесь, где я называю strcpy(data[i]->code_name, token) я получаю сегментации fualt , почему это? Что я делаю не так?

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; 
} 

файл

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

Где вы выделяете память для 'data'? – Barmar

+0

Это не требуется для страны? или я ошибаюсь – jhowe

+1

Распределение «страна» отсутствует. Это определение типа, а не переменная. – Barmar

ответ

2

Вы объявили указатель переменной data, но никогда не назначается, чтобы она указывала на любую память. Вы должны сделать это в main():

data = malloc(sizeof(*data)); 

Но нет никакой реальной необходимости указатель здесь, просто объявить обычную переменную:

country data; 

На самом деле, я полагаю, что вы не ставите массив измерение в определении типа. Вы должны объявить тип структуры, а затем объявить массив структур.

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

country data[244]; 

Если вы все еще хотите использовать указатель вместо обычной переменной, это будет:

country *data; 

затем в main() вы могли бы сделать:

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

Вы также должны Инициализация i:

int i = 0; 

и

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

не соответствует действительности. feof() возвращает 1 при достижении EOF, а не EOF. Оно должно быть:

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

спасибо! это работало, не осознавая, что я делаю неправильно – jhowe

+1

@jhowe Вы копируете каждое поле файла в поле 'code_name', но поскольку оно объявлено' char [3] ', оно может содержать только 2 символа (третий байт - для нулевого терминатора). Таким образом, вы пишете за пределами массива, что является неопределенным поведением. – Barmar

+0

быстрый вопрос, как передать целое число из файла в совокупность в структуре, я пробовал это: data [i] .population = atoi (токен); \t \t \t \t strcpy (данные [i] .популяция, токен); но он не работал – jhowe

0

Поскольку назначения, data, который является указателем на typedef'ed country, является NULL.

strcpy() Доступ к данным NULL и segfaults.

Переменная data является глобальной переменной и инициализируется NULL в С.

исх: Why are global and static variables initialized to their default values?, Are global variables always initalized to zero in C?