strtok() の説明です。
#include <string.h>
char* strtok( char* s1,
const char* s2 );*
strtok() の最初の呼び出しは、s1 が指す文字列の最初のトークンへのポインターを返します。文字列内の次のトークンを取得するには、strtok() のその後の呼び出しで最初の引数として NULL ポインターを渡す必要があります。
しかし、文字列内の次のトークンを取得するために NULL ポインターを渡す必要がある理由がわかりません。 約 15 分間検索しましたが、インターネットで説明は見つかりませんでした。
ベストアンサー1
strtok()
は、静的変数を使用して、一部のデータを内部に保持します。この方法では、strtok()
前回の呼び出し中に中断したポイントから検索を続行できます。strtok()
同じ文字列の検索を継続することを通知するには、NULL
最初の引数としてポインターを渡します。strtok()
最初の引数が null かどうかを確認しNULL
、そうである場合は、現在格納されているデータを使用します。最初のパラメーターが null でない場合は、新しい検索として扱われ、すべての内部データがリセットされます。
おそらく、最も良い方法は、関数の実際の実装を検索することですstrtok()
。ここに投稿できるほど小さい実装を見つけたので、この NULL パラメータの処理方法を理解してください。
/* Copyright (c) Microsoft Corporation. All rights reserved. */
#include <string.h>
/* ISO/IEC 9899 7.11.5.8 strtok. DEPRECATED.
* Split string into tokens, and return one at a time while retaining state
* internally.
*
* WARNING: Only one set of state is held and this means that the
* WARNING: function is not thread-safe nor safe for multiple uses within
* WARNING: one thread.
*
* NOTE: No library may call this function.
*/
char * __cdecl strtok(char *s1, const char *delimit)
{
static char *lastToken = NULL; /* UNSAFE SHARED STATE! */
char *tmp;
/* Skip leading delimiters if new string. */
if ( s1 == NULL ) {
s1 = lastToken;
if (s1 == NULL) /* End of story? */
return NULL;
} else {
s1 += strspn(s1, delimit);
}
/* Find end of segment */
tmp = strpbrk(s1, delimit);
if (tmp) {
/* Found another delimiter, split string and save state. */
*tmp = '\0';
lastToken = tmp + 1;
} else {
/* Last segment, remember that. */
lastToken = NULL;
}
return s1;
}