2011-03-27 17 views
0

昨天我的功能有問題,原來是一個簡單的修復,現在我有一個不同的問題,它令我莫名其妙。該函數是一個標記:問題與strtok只保存第一個令牌

void tokenizer(FILE *file, struct Set *set) { 
    int nbytes = 100; 
    int bytesread; 
    char *buffer; 
    char *token; 
    buffer = (char *) malloc(nbytes + 1); 
    while((bytesread = getLine(&buffer,&nbytes,file)) != -1) { 
      token = strtok(buffer," "); 
      while(token != NULL) { 
       add(set,token); 
       token = strtok(NULL," "); 
      } 
    } 
} 

我知道輸入(文本文件),是因爲在第二while循環我可以添加的printf(「%S」,令牌)得到破碎成令牌正確地顯示每個令牌。但是,問題在於添加。它只是將第一個標記添加到我的列表中,但同時仍然正確地分解每個標記。例如,如果我輸入的文本是「嗒嗒HERP DERP」我會得到

令牌=等等

令牌= HERP

令牌= DERP

但名單將只包含第一令牌,等等。我不相信這個問題是與補充,因爲它適用於自己的,也就是說我可以用

add(set,"blah"); 
add(set,"herp"); 
add(set,"derp"); 

,其結果將是一個包含所有三個單詞的列表。

謝謝你的幫助!

+0

'add'看起來像什麼? – Yuliy 2011-03-27 18:24:53

+0

你可以發佈'add(set,token)'方法的代碼嗎? – pajton 2011-03-27 18:25:31

+1

'buffer =(char *)malloc(nbytes + 1);''不需要劇組,你永遠不會釋放相關的內存:) – pmg 2011-03-27 18:35:17

回答

2

strtok()返回一個指向字符串緩衝區的指針。您需要strdup()該字符串,並將結果添加到您的樹中。清理樹時不要忘記free()

+0

完美的工作!非常感謝你! – Andy 2011-03-27 18:29:57

+1

'strdup'不保證在所有C(C89或C99)實現中都存在。它在POSIX雖然 – pmg 2011-03-27 18:34:04

+0

我仍然是新來的C,所以這意味着我應該通常避免使用strdup()或是否安全使用?該程序只能在我的機器上運行,如果有問題的話。 – Andy 2011-03-27 18:39:45