2012-02-23 8 views
12

私はstrtokが入力引数を変更することを理解していますが、この場合、入力文字列を最初のトークンのみに縮小しています。なぜこれが起こっているのですか?それを修正するために何ができますか?なぜstrtokはこのような入力を変更していますか?

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

int main(int argc, char* argv[]) { 
    char input[]="this is a test of the tokenizor seven"; 
    char * temp; 
    temp=strtok(input," "); 
    printf("input: %s\n", input); //input is now just "this" 
} 

答えて

24

strtok()がトークンを検出すると、トークンの直後の文字を\0に変更し、トークンへのポインタを返します。次にNULL引数を指定して呼び出すと、最初のトークンを終了したセパレータ、つまり\0の後に、おそらくそれ以降のセパレータが検索されます。今

、文字列の先頭に、元のポインタはまだ文字列の先頭を指しますが、最初のトークンは今 - 末端\0である - すなわち、printf()は、トークンの終わりは、文字列の末尾であると考えて。残りのデータはまだそこにありますが、\0printf()のデータを表示していません。 for -loopを使用して元の入力文字列まで元の文字数まで戻った場合、そのデータはまだすべて存在しています。

+1

ありがとうございます。 strtokがどのように動作するのか理解していましたが、トークンを外してからdelimeterの後の最初の文字に入力ポインタを移動させたと仮定しました。とにかく、ありがとう!これは非常に明確かつ有益な答えでした。 – user1209326

+0

それは啓発だった、ありがとう。 –

2
(私は strtokは1回のコールの後に「これを」となり最初のトークンではなく、変数「入力」、である必要があり、変数「TEMP」、の話ではない、注意してください)

これは、strtokが各セパレータにヌルを挿入するためです。これは、strtokを繰り返し呼び出して各トークンを取得する理由です。 strtokの使用を開始すると入力文字列は使用できません。あなたはそれを "修正"しません - これはどのように動作するのですか?

+0

このような迅速な対応に感謝します。もちろん、私が「修正する」と言ったとき、私は「私が望む結果をどうやって得るのか」を意味しましたが、あなたが私を助けるために時間を割いてくれてありがとうと思います。 – user1209326

+0

入力文字列の影響を受けないコピーが必要な場合は、strtokの前にコピーを作成する必要があります。 – Joe

3

strtokから受け取ったトークンを出力し、NULLがstrtokによって挿入されるため、入力配列について心配する必要はありません。すべてのトークンを取得するには、繰り返し呼び出しが必要です。

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

int main(int argc, char* argv[]) { 
    char input[]="this is a test of the tokenizor seven"; 
    char * temp; 
    temp=strtok(input," "); 
    while(temp != NULL) { 
    printf("temp is \"%s\"\n", temp); 
    temp = strtok(NULL, " "); 
    } 
} 
+0

私が上記のように、strtokがどのように実際にトークン化されたのか、私は明らかに間違っていました。ご協力いただきありがとうございます! – user1209326

関連する問題