2016-11-29 77 views
0

我試圖做一個函數來分離單詞中的一個句子並將這些單詞存儲到一個字符串數組中。如果我使用全局變量,它的工作原理是,字符串存儲很好,工作完成,但是,當我嘗試傳遞一個在main中定義的數組時,它將無法工作。從主要數組中存儲函數的標記(strtok)

void split(char sentence[], char *words[]){ 
    unsigned char n= 0; 
    const char delim n= " "; 
    char clone[strlen(sentence)]; 
    strcpy(clone, sentence); 

    char *token; 
    token= strtok(clone, delim); 

    while(token != NULL){ 
    words[n++]= token; 
    token= strtok(NULL, delim); 
    } 
    words[n]= NULL; //Needed for future usage of the array; 
} 

int main(){ 
    char *sentenceFromMain; 
    sentenceFromMain= "A BB CCC DDDD"; 

    char *wordList[nrOfWords+1]; //I do have another function that counts words 

    split(sentenceFromMain, wordList); 
    exit(0); 
} 

如果我在這個功能,例如,words[0]= "A";它的作品。 令牌是否返回指針?我應該如何獲取存儲在其中的內容?我嘗試了多種方式來做到這一點,但都沒有效果。歡迎每一個迴應!

+0

您正在傳遞指向*字符串*的指針,但是'strtok'寫入正在檢查的字符串,這是非法的。 –

+0

@WeatherVane OP使用_clone_。 – BLUEPIXY

+0

'const char delim n =「」;' - >'const char * delim =「」;' – BLUEPIXY

回答

0

這裏的問題是strtok返回指向它標記的字符串的指針。你得到的指針將指向clone數組,它在split函數中是本地的。一旦split函數返回指針將不再有效。解決這個問題

一種可能的方式是沒有本地clone陣列,但它具有外部的功能外,並且在將它作爲第一個參數,並使用該參數在調用strtok

+0

這可能是一個解決方案,但是我會在我的程序中多次使用此功能。我應該把克隆主要放在哪裏?如果我這樣做,每當我需要改變它時,我應該如何覆蓋它? – Cooble