strtokソースコード分析とstrtok_r
Strtok Source Code Analysis
/* * strtok_r.c: * Implementation of strtok_r for systems which don't have it. * * This is taken from the GNU C library and is distributed under the terms of * the LGPL. See copyright notice below. * */ #ifdef HAVE_CONFIG_H #include 'configuration.h' #endif /* HAVE_CONFIG_H */ #ifndef HAVE_STRTOK_R static const char rcsid[] = '$Id: strtok_r.c,v 1.1 2001/04/24 14:25:34 chris Exp $' #include #undef strtok_r /* Parse S into tokens separated by characters in DELIM. If S is NULL, the saved pointer in SAVE_PTR is used as the next starting point. For example: char s[] = '-abc-=-def' char *sp x = strtok_r(s, '-', &sp) // x = 'abc', sp = '=-def' x = strtok_r(NULL, '-=', &sp) // x = 'def', sp = NULL x = strtok_r(NULL, '=', &sp) // x = NULL // s = 'abc/0-def/0' */ char *strtok_r(char *s, const char *delim, char **save_ptr) { char *token if (s == NULL) s = *save_ptr /* Scan leading delimiters. */ s += strspn(s, delim) if (*s == '/0') return NULL /* Find the end of the token. */ token = s s = strpbrk(token, delim) if (s == NULL) /* This token finishes the string. */ *save_ptr = strchr(token, '/0') else { /* Terminate the token and make *SAVE_PTR point past it. */ *s = '/0' *save_ptr = s + 1 } return token }
ここで、関数は主にs + = strspn(s、delim)であると理解されるべきです。
strspn(添え字に表示される指定された文字列に含まれない文字列を返します)
ヘッダーファイル#include
定義された関数size_tstrspn(const char * s、const char * accept)
説明strspn関数()は、パラメータの文字列の先頭から継続的に計算され、文字は完全に参照されて文字列を受け入れます。簡単に言えば、strspn()がnの値を返す場合、sはn文字の連続文字列の始まりを表し、文字列内の文字はacceptに属します。
戻り値文字列の先頭を返します。文字列acceptに含まれる連続した文字数。
したがって、このコードは、一致するデリムの文字の先頭にある最初のシールドセクションが
s = strpbrk(トークン、共有)
使用法:#include
機能:ターンテスト キャラクター S1文字列。文字がテスト文字列s2にも含まれている場合、テストは停止し、文字位置を返します。NULLヌル文字は含まれません。
説明:最初の文字のs1が条件を満たすことを返します ポインタ 一致する文字が返されない場合は空 ポインタ ヌル。
目的:文字列の任意の位置にある最初の(s2)で検索文字列を識別し、ソース(s1)を返すために、いいえの場合はnullポインターが返されます。
プロトタイプ:extern char * strpbrk(char * s1、char * s2)
* save_ptr = strchr(token、 '/ 0')
プロトタイプ:extern char * strchr (const char * s、char c)
const char * strchr(const char * _Str、int _Val)
char * strchr(char * _Str、int _Ch)
ヘッダーファイル:#include
機能:検索 キャラクター 文字c位置の最初の出現のS文字列
説明:cの最初の出現位置を返します ポインタ cがsに存在しない場合、NULLが返されます。
戻り値:成功した場合は文字列内で最初に出現した文字のアドレスを返し、そうでない場合はNULLを返します
sが空の場合、最後のsave_ptr文字 ' 0'にある文字へのポインタが、次にstrtok_rを呼び出すときに、直接NULLを返すことを理解しました。
コード全体のプロセスは次のとおりです。
(1)パラメータsがNULLであるかどうかを判断し、save_ptrに渡された場合はNULLであり、NULLでない場合は分解開始位置を決定し、s開始セグメンテーションを配置します。
(2)文字列区切り文字の先頭をすべてスキップするように分解されます。
(3)NULLが返される場合(戻り値の解釈の(a)へのリンクがNULLである場合)、現在の位置を分解するかどうかを決定します。続行しない場合。
(4)現在のトークン文字列ポインタを保存するために分解され、strpbrkを呼び出してトークン区切り文字を見つけます:そうでない場合、文字列save_ptrの末尾が分解されます割り当て '/ 0'の場所が見つかり、トークンを変更しません。割り当てられた区切り文字 '/ 0'、トークンが切り捨てられた(抽出)に対応する位置、save_ptrは次の区切り文字を指します。
(5)最後に、(検索するかどうかに関係なく)関数が返されます。
2、strtok関数
char *strtok(char *s, const char *delim) { static char *last return strtok_r(s, delim, &last) }