2011-09-28 64 views
0

我一直在瘋狂試圖找出什麼是做錯了。我承認在C方面我缺乏經驗,但我不知道什麼是錯的。我訪問/使用結構的方式是不正確的嗎?在Xcode中的分段錯誤,調試器不能幫助我

編輯:我一直在調試器中得到EXC_BAD_ACCESS。

#include <stdio.h> 
#include <string.h> 
#define MAX_STRING 20 
#define MAX_PLYR 16 

typedef struct { 

     char pname[MAX_STRING]; 
     int runs; 
     char *s; 

} Team_t; 

int 
main(void) 
{ 
     Team_t *team_data[MAX_PLYR]; 
     int i; 
     char *p; 
     char name[MAX_STRING]; 
     FILE *inp; 
     inp = fopen("teamnames.rtf", "r"); 

     for (i = 0; i < MAX_PLYR;) { 
      while ((fgets(name, MAX_STRING, inp) != NULL)); 
      printf("Name(i): %s\n", name); 
      strcpy(team_data[i]->pname, name); 
      i++; 
     } 
     fclose(inp); 
     return(0); 
} 

編輯:這裏有什麼變化,仍然得到分割錯誤

#include <stdio.h> 
#include <string.h> 

#define MAX_STRING 20 

#define MAX_PLYR 16 


typedef struct { 

char pname[MAX_STRING]; 
int runs; 
char s; 

} Team_t; 

int 
main(void) 

{ 
Team_t team_data[MAX_PLYR]; 

char name[MAX_STRING]; 

int i; 

FILE *inp; 

inp = fopen("teamnames.rtf", "r"); 

for (i = 0; i < MAX_PLYR; i++) { 

    ((fgets(name, MAX_STRING, inp))); 

    if (feof(inp)) { 

     printf("End of stream\n"); 

     i = MAX_PLYR; 

    } 

    else { 

     if (ferror(inp)) { 

      printf("Error reading from file\n"); 
} 

    printf("Name(i): %s\n", name); 

    strcpy(team_data[i].pname, name); 
} 
} 

fclose(inp); 

return(0); 
} 
+2

請務必檢查'fopen'返回狀態,文件中並不總是成功打開 – Joe

+0

爲什麼人們總是混合使用空格-.-品牌標籤如果編輯器的間距不對,很難重新格式化和理解。 – Constantinius

+0

'for'循環中的'while'循環會導致問題。要麼從文件中讀取固定數量的項目(如在'for'循環中),要麼直到文件結尾讀取所有項目(如在'while循環中),但嘗試組合它們不會按照它應該的方式工作。尤其是,如果有'''阻止'while'循環的主體。 –

回答

0

您聲明team_data但你不給它分配;因此它將指向隨機存儲器,數組的虛構內容也是如此。您需要實際創建陣列,如

Team_t * team_data [MAX_PLYR] =(Team_t **)malloc(MAX_PLYR * sizeof(Team_t *));

+0

我應該從team_data中刪除*嗎?我很抱歉我的不理解,但我非常新C –

+0

是的,正如其他海報推薦的那樣,您可以擺脫指針並將其聲明爲'Team_t team_data [MAX_PLYR]'。這改變了你用來訪問元素的語法:通常你會使用'.'而不是' - >'。 –

0

使用結構,而不是指針(或者,如果你堅持使用指針的分配對於那些結構空間)

Team_t team_data[MAX_PLYR]; 

fgets(team_data[i].pname, MAX_STRING, inp) 
0

當你寫

Team_t *team_data[MAX_PLYR]; 

你是不是分配的實際Team_t任何內存記錄,而是建立一個記錄指針數組。

相反,如果你會寫

Team_t team_data[MAX_PLYR]; 

你會分配的記錄。當你再要複製到team_data數組你寫的,而不是

strcpy(team_data[i].name, name); 
+0

我按照你的建議分配了記錄,錯誤沒有改變。 –