2011-11-24 72 views
0

我在C問題上掙扎,我無法弄清楚我做錯了什麼。單詞文件中的鏈接列表

我正在使用鏈表來存儲單詞。當我執行以下命令:

list *myList = list_new(); 
list_append(myList,"Word_01"); 
list_append(myList,"Word_02"); 
list_append(myList,"Word_03"); 
list_append(myList,"Word_04"); 
list_print(myList); 

一切都OK,我得到這樣的輸出:

Word_01 -> Word_02 -> Word_03 -> Word_04 -> NULL 

好了,現在我走的話,從存儲在文件列表:

Word_01 
Word_02 
Word_03 
Word_04 

並執行此代碼:

const char *filename; 
filename = "list"; 
list *myList2 = list_new(); 
FILE* file = NULL; 
size_t size; 
char line[256]; 
file = fopen(filename, "r"); 
if (file != NULL) 
{ 
    printf("File opened.\n"); 
    while (fgets(line, 256, file) != NULL) { 
     list_append(myList2, line); 
    } 
    fclose(file); 
} 
else { 
    printf("Could not open file.\n"); 
    exit(EXIT_FAILURE); 
} 
list_print(myList2); 

然後我得到以下輸出:

Word_04 -> Word_04 -> Word_04 -> Word_04 -> NULL 

有人可以解釋我爲什麼會發生這種情況?

編輯: 這裏是list_append()

void list_append(list *l, char *w) { 
    word *new_word = malloc(sizeof(word)); 
    if (l == NULL || new_word == NULL) { 
     exit(EXIT_FAILURE); 
    } 
    new_word->_word = w; 
    new_word->next = NULL; 
    if (l->first->_word == "") { 
     l->first = new_word; 
    } 
    else { 
     word *temp = malloc(sizeof(word)); 
     temp = l->first; 
     while(temp->next != NULL) { 
      temp=temp->next; 
     } 
     temp->next = new_word; 
    } 
} 
+6

您需要**將** list_append()中的字符串** **。你現在正在做的是保存指針值(指向'line'的指針)。每次'行'的內容改變所有這樣的指針改變相同的方式。另外不要忘記'fgets()'保留尾部的''\ n''。 – pmg

+0

由於pmg建議問題在list_append() –

+0

如何複製'char []'而不是指針? – kh4r4

回答

1

正如評論指出的那樣,你不正確地處理字符串。 C風格的字符串不是你可以用==等號的東西,或者用=賦值。這是一個C++教程,但給C字符串的一個很好的解釋:

http://www.learncpp.com/cpp-tutorial/66-c-style-strings/

還檢查了文檔的strcmp(),strcpy的()和strlen的()。我使用這些函數修復了註釋中提到的位 - 請注意我的意見:

void list_append(list *l, char *w) { 
    word *new_word = malloc(sizeof(word)); 
    if (l == NULL || new_word == NULL) { 
     exit(EXIT_FAILURE); 
    } 

    //new_word->_word = w; 
    // Allocate space and copy contents, not the pointer 
    new_word->_word = malloc(strlen(w) + 1); 
    strcpy(new_word->_word, w); 

    new_word->next = NULL; 
    //if (l->first->_word == "") { 
    // Use strcmp() to compare the strings - returns 0 if they are equal 
    if (strcmp(l->first->_word, "") == 0) { 
     l->first = new_word; 
    } 
    else { 
     word *temp = malloc(sizeof(word)); 
     temp = l->first; 
     while(temp->next != NULL) { 
      temp=temp->next; 
     } 
    temp->next = new_word; 
    } 
}