2016-11-29 3 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

関連する問題