2013-02-08 53 views
0

只是爲了它的樂趣,我正在編寫一個程序,它將接收用戶輸入的字符串(或者甚至可能是文本文檔)並對字符串中的單詞進行加擾。strtok的更清潔的實現

我試圖使用strtok函數來分隔字符串中的每個單詞。目前,我覺得我目前執行的strtok是馬虎:

int main(int argc, char *argv[]) 
{ 
    char *string, *word; 

    if(!(string = getstr()))  //function I wrote to retrieve a string 
    { 
     fputs("Error.\n", stderr); 
     exit(1); 
    } 
    char array[strlen(string) + 1];  //declare an array sized to the length of the string 
    strcpy(array, string);   //copy the string into the array 
    free(string); 
    if(word = strtok(array, " ")) 
    { 
     //later I'll just write each word into a matrix, not important right now. 
     while(word = strtok(NULL, " ")) 
     { 
     //later I'll just write each word into a matrix, not important right now. 
     } 
    } 
    return 0; 
} 

我覺得必須有執行strtok沒有通過該計劃中途聲明數組的一個更清潔的方式。這只是我感覺不正確。是否使用strtok正確的方法來解決這個問題?我寧願不使用固定大小的數組,因爲我喜歡一切都是動態的,這就是爲什麼我開始懷疑使用strtok是正確的方法。

+0

'free(string);'爲什麼?我沒有看到任何'malloc','getstr()'動態分配內存嗎? – 2013-02-08 16:06:16

+1

'char array [strlen(string)];'需要'char array [strlen(string)+ 1];' – 2013-02-08 16:06:58

+0

@AlokSave'getstr()'動態地分配內存。 @PaulR我剛更新了它,謝謝。 – 2013-02-08 16:17:16

回答

2

如果您免費爲您提示字符串malloced。那麼你不需要將它複製到一個新的緩衝區(這是btw 1個字符太短)。使用您提供的緩衝區。

如果const char *是由您提供的,那麼您只需要複製它,即不允許修改緩衝區的內容。

因爲常規strtok不可重入,所以最好使用strtok_r

+0

哎喲我的疏忽。哇謝謝你。 – 2013-02-08 16:19:01

+0

「使用strtok_r作爲常規strtokis不可重入也更好。」 +1的評論。我想知道OP是否想要實現與所有疣(主要是不可重入)的「真正」strtok,或者如果OP想要實現更好的strtok。 – 2013-02-08 17:24:35

0

可以使用scanf()代替getstr()strtok()

char word[100]; 
while(scanf(" %s",word)!=EOF) { 
    // use the word string here 
} 

用戶應該停止輸入chracters與

  • EOF = CTRL + d(Linux版)

  • EOF = CTRL +ž(適用於Windows)

+0

對不起編輯我的問題更清楚,我試圖動態地做到這一點我不想使用'scanf'。 – 2013-02-08 16:18:06