2012-11-13 65 views
1

這個程序應該採用數組(在文件中)的數組num和2d數組的名字(第一個,最後一個,最初)。但是,我不斷收到賽格錯誤,我不知道爲什麼。我所做的是分配內存,然後使用fscanf獲取行數,並使用fgets獲取名稱,同時將所有'\n'更改爲'\0'。然後,我使用strtok將單獨的數組分成標記,我相信我可能在某處出錯。使用2d數組的malloc和strtok

編輯:現在我得到傳遞參數1的'strcpy'使整數指針沒有轉換。 我要怎麼解決這個問題

這是我的代碼:

int main (int argc, char *argv[]) 
{ 
    int num; 
    FILE *fp; 
    fp = fopen(argv[1], "r"); 

    fscanf(fp, "%d", &num); 

    int j; 
    char **f, **l, *m; 
    int i = 0; 

    f = (char**) malloc(num * sizeof (char*)) 


    for (i = 0; i < num;i++) 
     ; 
    f[i] = (char*) malloc(num * sizeof (char)); 
    l = (char**)malloc(num*sizeof(char*)); 

    for (i=0; i<num;i++) 


    l[i] = (char*) malloc(num * sizeof (char)); 

    m = (char*) malloc(num*sizeof(char)); 

    read_names(fp, f, l, m, num); 

// sort(fp, num, f, l, m); 
// display(num, ar); 

    for (j = 0; j < num; j++) { 
     free(f[j]); 
     free(l[j]); 
    } 

    free(f); 
    free(l); 
    free(m); 
    fclose(fp); 

    return(0); 
} 

    void read_names (FILE *fp, char **f, char **l, char m,int num) 
    { 
    int i=0; 

    char temp[80]; 


    for (i=0; i<num; i++) 
    { fgets(temp, 80,fp); 
    char *ptr=strtok (temp,","); 
    strcpy(*f[i], ptr); 
    char *ptr1=strtok (temp, " "); 
    strcpy(*l[i], ptr1); 
    char *ptr2=strtok (temp, ". "); 
    strcpy(m[i],ptr2); 
} 

    } 
+5

請正確格式化您的代碼。 –

+0

每個名/姓都分配了num個字節。你確定名稱的長度應該與從文件中讀取的名字的數量相匹配嗎? – simonc

+0

另外一個調試段錯誤的策略是在函數中加入額外的'return',直到段錯誤消失。最終你會發現segfault發生在哪一行。 –

回答

1
f=(char**)malloc (num*sizeof(char*)); 
for (i=0; i<num;i++); 
f[i]=(char*)malloc (num*sizeof(char)); 

l=(char**)malloc (num*sizeof(char*)); 
for (i=0; i<num;i++); 
l[i]=(char*)malloc (num*sizeof(char)); 

m=(char*)malloc (num*sizeof(char)); 

你應該確保F,F [I],1,1- [I]不爲NULL。

3

您的for循環出現問題。不要將下面的行包圍在下面,而是用分號終止for()循環。刪除分號,或許更好,養成總是使用{}的習慣,你不會再遇到這個問題。

編輯: 如果您正確縮進代碼,您可能已經發現了錯誤。

+0

當然,使用大括號實際上並不能防止這種情況,因爲for(i = 0; i <5; i ++); {printf(「運行一​​次\ n」); }'仍然有效C,仍然會編譯,並且仍然只會打印一次。 –

+0

是的,但如果你正確縮進並且習慣於總是使用{}和if/else/while/do等,那麼你不太可能犯這個錯誤,這正是我所爭論的。哎呀,單獨縮進可能會阻止它。這讓我感到我的一個寵兒 - 以「自由」(或者編譯器的便利性?)的名義,我們讓開發者重新犯同樣的錯誤。登記時強制格式化ftw我說... –