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

私の構造体にフィールドを置くしようとしているが、私は私がセグメンテーションfualtを取得strcpy(data[i]->code_name, token)を呼び出し、ここでなぜ私は(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の際にセグメンテーションフォールトを取得。何故ですか?私は間違って何をしていますか?

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

'country'の割り当てはありません。型定義であり、変数ではありません。 – Barmar

答えて

2

あなたはポインタ変数dataを宣言しますが、任意のメモリを指すように割り当てられたことはありません。普通の変数を宣言し、

data = malloc(sizeof(*data)); 

しかし、ここではポインタのための本当の必要はありません:あなたは main()でこれを行う必要があり

country data; 

実は、私はあなたが配列を入れていないことを示唆していますディメンションを型定義に追加します。構造体の型を宣言し、次に構造体の配列を宣言する必要があります。あなたはまだ代わりに、通常の変数のポインタを使用したい場合は

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

country data[244]; 

、それは次のようになります。あなたはどうなるmain()で、その後

country *data; 

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

また、する必要が初期化i

int i = 0; 

および

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

が間違っています。 feof()は、EOFではなく、EOFに達したときに1を返します。それは次のようになります。

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

ありがとうございます!この仕事は私が間違っていたことを理解していませんでした – jhowe

+1

@jhoweファイルのすべてのフィールドを 'code_name'フィールドにコピーしていますが、' char [3] 'と宣言されているので、バイトはヌルターミネータ用です)。つまり、配列の境界の外側に書いています。これは未定義の動作です。 – Barmar

+0

簡単な質問どのように私は構造体の人口にファイルから整数を渡すか私はこれを試した:data [i] .population = atoi(token); \t \t \t \t strcpy(data [i] .population、token);それは仕事をしなかった – jhowe

関連する問題