2017-01-23 5 views
-2

私にセグメンテーションフォールトを与えているコードがあります。私はそれをデバッグし、strcpyが実行されたときにエラーが発生しました。コードは、テキストファイルからデータを抽出し、構造体の配列に格納しようとしています。 strcpyを使って、テキストファイルのデータを構造体に格納することを計画しています。なぜこれが起きているのか?strcpyは私にセグメンテーションフォールトを与えます

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
int input(char *s, int length); 

void main(){ 

    char *tok; 
    char *buffer; 
    size_t bufsize = 32; 
    size_t characters; 
    FILE *f; 
    char *file_name; 
    char line[255]; 
    int currentRoom; 
    int count = 0; 
    typedef struct { 
     char room_n; 
     char description[100]; 
     char room_north; 
     char room_south; 
     char room_west; 
     char room_east; 
    } room; 

    //Creating an array of structs 
    room record[1000]; 
    while(1){ 

     buffer = (char *)malloc(bufsize * sizeof(char)); 


     if(buffer == NULL){ 
      perror("Unable to allocate buffer"); 
      exit(1); 
     } 
     printf("Enter a command: "); 
     characters = getline(&buffer, &bufsize, stdin); 

     if(strcmp(buffer,"exit\n") == 0){ 
      printf("Exiting...\n"); 
      exit(1); 
     } 

     tok = strtok(buffer, " \n"); // Tokenize input 
     printf("%s is the token \n", tok); 


     if (strcmp(tok,"loaddungeon") == 0){ 
      file_name = strtok(NULL, "\n"); 
      printf("file name : %s \n", file_name); 
      f = fopen(file_name,"r"); 
      while (fgets(line, sizeof(line), f) != NULL) 
       { 

        char val1[128]; 
        char val2[128]; 
        char val3[128]; 
        char val4[128]; 
        char val5[128]; 
        char val6[128]; 

        strcpy(val1, strtok(line, "$")); 
        strcpy(val2, strtok(NULL, "$")); 
        strcpy(val3, strtok(NULL, " ")); 
        strcpy(val4, strtok(NULL, " ")); 
        strcpy(val5, strtok(NULL, " ")); 
        strcpy(val6, strtok(NULL, " ")); 

        //Segmentation fault error occurs here 
        strcpy(record[count].room_n, val1); 
+8

に変更してください。 'strcpy()'の引数は 'char *'でなければなりません。 'room_n'は' char'です。 – Barmar

+3

その行についてコンパイラ警告を受けているはずです。警告を無視しないでください。 – Barmar

+0

構造体の行をchar room_nからchar * room_nに変更しましたが、警告が出なくなりましたが、seg faultが発生しました。 – user87002

答えて

2

のstrcpyの定義は()である:

char *strcpy(char *dest, const char *src) 

where-

  • DEST - これは コンテンツをコピーする先の配列へのポインタです。

  • src - これはコピーする文字列です。 strcpyのに渡されたあなたのコードの引数で

()charchar *です:

strcpy(record[count].room_n, val1); 

構造で定義されているように:

typedef struct { 
     char room_n; //room_n declared as 'char' 
     char description[100]; 
     char room_north; 
     char room_south; 
     char room_west; 
     char room_east; 
    } room; 

提案:

ためのメモリを割り当てroom_nをポイントします。宣言を char room_n[128];

+0

気にしないで、私はそれを修正しました。ありがとう! – user87002

+0

こんにちは.. @ Barmarによって提案された変更を加えました..ありがとう! –

関連する問題