このstrtok
機能を説明するサンプル プログラムを見つけました。
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] ="- This, a sample string.";
char * pch;
printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtok (str," ,.-");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ,.-");
}
return 0;
}
しかし、これがどのように機能するのか分かりません。
が新しいトークンを返すのはどうしてでしょうかpch = strtok (NULL, " ,.-");
。 つまり、 を呼び出しているのですstrtok
。NULL
これは私にはあまり意味がありません。
ベストアンサー1
について知っておくべき2つのことstrtok
。すでに述べたように、それは「内部状態を維持します」。また、入力した文字列が台無しになる本質的には、指定したトークンが見つかった場所に を書き込み'\0'
、文字列の先頭へのポインタを返します。内部的には最後のトークンの位置が維持され、次回呼び出すときにはそこから開始されます。
重要な帰結として、文字列の内容を変更するとアクセス違反が発生するため、文字列の種類strtok
には を使用できないということです。const char* "hello world";
const char*
の「良い」点はstrtok
、実際には文字列をコピーしないため、追加のメモリ割り当てなどを管理する必要がないことです。ただし、上記を理解していないと、正しく使用するのが難しくなります。
例 - 「this,is,a,string」がある場合、 を連続して呼び出すと、strtok
次のようにポインターが生成されます ( は^
返される値です)。 は'\0'
トークンが見つかった場所に追加されることに注意してください。これは、ソース文字列が変更されることを意味します。
t h i s , i s , a , s t r i n g \0 this,is,a,string
t h i s \0 i s , a , s t r i n g \0 this
^
t h i s \0 i s \0 a , s t r i n g \0 is
^
t h i s \0 i s \0 a \0 s t r i n g \0 a
^
t h i s \0 i s \0 a \0 s t r i n g \0 string
^
意味が通じることを願います。