strtok() - 文字列内の次のトークンを取得するために NULL ポインターを渡す必要があるのはなぜですか? 質問する

strtok() - 文字列内の次のトークンを取得するために NULL ポインターを渡す必要があるのはなぜですか? 質問する

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;
}

おすすめ記事