C言語のstrtok関数はどのように機能しますか? [重複] 質問する

C言語のstrtok関数はどのように機能しますか? [重複] 質問する

この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, " ,.-");。 つまり、 を呼び出しているのですstrtokNULLこれは私にはあまり意味がありません。

ベストアンサー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
                              ^

意味が通じることを願います。

おすすめ記事