次のプログラムでstrtok()
は、大部分は期待どおりに動作しますが、1 つの発見の背後にある理由を理解できません。私はそれについて読んstrtok()
だ:
トークンの開始と終了を決定するために、関数は最初に区切り文字に含まれていない最初の文字 (トークンの開始となる) の開始位置からスキャンします。次に、このトークンの先頭から、区切り記号に含まれる最初の文字をスキャンします。これがトークンの末尾になります。
ご存知のように、各トークンの末尾にstrtok()
aを配置します。\0
しかし、次のプログラムでは、最後の区切り文字はドット ( .
) であり、その後、そのドットと引用符 ( ) の間にToad"
があります。現在、ドットは私のプログラムの区切り記号ですが、Toadの後に区切り記号はなく、空白 (私のプログラムの区切り記号) もありません。この前提から生じる次の混乱を解消してください。
2 つの区切り文字の間にないのに、Toadstrtok()
をトークンと見なすのはなぜですか? これは、NULL文字( )に遭遇したときに私が読んだことです:strtok()
\0
strtok の呼び出しで str の終端の null 文字が検出されると、最初の引数として null ポインターを使用したこの関数への後続の呼び出しはすべて null ポインターを返します。
null 文字が検出されると、トークンの先頭へのポインターが返されるとはどこにも書かれていません (区切り文字が見つからなかったため、トークンの末尾を取得できなかったため、ここにはトークンすらありません)。トークンの先頭 (つまり、Toad の「T」) から開始されたスキャンの後、区切り文字ではなく、null 文字のみが見つかりました)。では、引数文字列の最後の区切り文字と引用符の間の部分がトークンと見なされるのはstrtok()
なぜですか? これを説明してください。
コード:
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] =" Falcon,eagle-hawk..;buzzard,gull..pigeon sparrow,hen;owl.Toad";
char * pch=strtok(str," ;,.-");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ;,.-");
}
return 0;
}
出力:
ハヤブサ
ワシミミズク
ノスリ カモメ ハト スズメ
メンドリ フクロウ ヒキガエル _