2010-12-08 109 views
0

我寫了一個程序。它將文本文件中的數據逐字地讀取到鏈接列表中。但是在列出這些詞時存在一個問題。列出鏈接列表

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

typedef struct list 
{ 
    char *data; 
    struct list *next; 
} node; 

int main() 
{ 
    int i; 
    char *word = NULL; 
    char line[1000]; 
    node *root,*temp; 

    root = (node *) malloc(sizeof(node)); 
    temp = root; 
    FILE *f = fopen("test.txt","r"); 
    while (fgets(line, sizeof(line), f)) 
     for (word = strtok(line, " "); word; word = strtok(NULL, " ")) 
     { 
      temp->data = word; 
      temp->next=(node *) malloc(sizeof(node)); 
      temp=temp->next; 
     } 
    fclose(f); 
    temp =root; 
    for(i=0; i<10; i++) 
    { 
     printf("%s\n",temp->data); 
     temp=temp->next; 
    } 
    return 0; 
} 
+0

如果您需要幫助,您應該說明問題所在。但是,如果是我,我會確保列表的解析和構建是正確的。似乎比列表更可能是問題。 – 2010-12-08 18:50:59

回答

3

從 '人的strtok':

使用這些 功能時一定要小心。如果你使用它們,注意 是:

* These functions modify their first argument. 
    * These functions cannot be used on constant strings. 
    * The identity of the delimiting character is lost. 

所以,你需要爲每個單詞分配新的內存,因爲的strtok返回的指針被索引到線陣列。

這最好由代碼改變爲示出:

... 
    while (fgets(line, sizeof(line), f)) { 
    printf("%s\n",line); 
    for (word = strtok(line, " "); word; word = strtok(NULL, " ")) { 
     printf("%p\n",word); 
     temp->data = word; 
... 

,當在接下來的輸入運行:

check default for switches 
throw stmts to exit node 

打印以下:

check default for switches 

0x7fff94e0bf70 
0x7fff94e0bf76 
0x7fff94e0bf7e 
0x7fff94e0bf82 
throw stmts to exit node 

0x7fff94e0bf70 
0x7fff94e0bf76 
0x7fff94e0bf7c 
0x7fff94e0bf7f 
0x7fff94e0bf84 
throw 
stmts 

t 
throw 
stmts 
to 
exit 
node 

注意,每行中第一個單詞的指針是相同的。