回答編集履歴
1
誤字修正
answer
CHANGED
@@ -3,26 +3,26 @@
|
|
3
3
|
※オリジナルの`strtok`では区切り文字を複数指定できますが、下の例では1文字に限定していますので注意してください。
|
4
4
|
|
5
5
|
---
|
6
|
-
0. 引数(`char *str)で指定された文字列先頭アドレスを返り値にセットする。(後で使います)
|
6
|
+
0. 引数(`char *str`)で指定された文字列先頭アドレスを返り値にセットする。(後で使います)
|
7
|
-
引数がNULLであれば、保存済みの
|
7
|
+
引数がNULLであれば、保存済みのstatic変数NEXTの値を先頭アドレスとして使う。
|
8
8
|
|
9
9
|
0. 先頭アドレスから文字列末端'\0'(NULL文字)まで検索し、指定の区切り文字(`const char *delim`)を見つける
|
10
10
|
|
11
|
-
0. 区切り文字が無く、末端'\0'(NULL文字)まで行ったら次回に出力するトークン文字列は無いということなので、
|
11
|
+
0. 区切り文字が無く、末端'\0'(NULL文字)まで行ったら次回に出力するトークン文字列は無いということなので、static変数NEXTにNULLをセットし、5.へ。
|
12
12
|
|
13
|
-
0. 区切り文字があれば、区切り文字の位置に'\0'(NULL文字)を埋め込む。'\0'(NULL文字)を埋め込んだ次の位置を変数NEXTへ保存しておく。(次に`strtok`が呼ばれた時に使うことを想定)
|
13
|
+
0. 区切り文字があれば、区切り文字の位置に'\0'(NULL文字)を埋め込む。'\0'(NULL文字)を埋め込んだ次の位置をstatic変数NEXTへ保存しておく。(次に`strtok`が呼ばれた時に使うことを想定)
|
14
14
|
|
15
15
|
0. 1で保存していた文字列先頭アドレスを返す。
|
16
16
|
|
17
17
|
---
|
18
18
|
**注意など**
|
19
19
|
|
20
|
-
オリジナルの`strtok`は内部に次のトークンへのポインタを保存するので、リエントラント(再入可能)ではなく、マルチスレッドでのプログラミングで使えないという制限があります。
|
20
|
+
オリジナルの`strtok`は内部に次のトークン文字列へのポインタ(上記のNEXT変数)を保存するので、リエントラント(再入可能)ではなく、マルチスレッドでのプログラミングで使えないという制限があります。
|
21
21
|
|
22
22
|
その制限をなくした、static変数で内部に保存しないバージョンの`strtok_r`と言う関数もあります。
|
23
23
|
[Man page of STRTOK](https://linuxjm.osdn.jp/html/LDP_man-pages/man3/strtok.3.html)
|
24
24
|
|
25
|
-
|
25
|
+
`strtok`も`strtok_r`も、ひとつ落とし穴(?)があって、区切り文字が連続している場合に空文字列がトークン文字列として返されません。その為、CSV形式のようなもので、文字列長0のデータがあるようなケースでは期待したように動作しません。以下の例をご覧ください。
|
26
26
|
|
27
27
|
```C
|
28
28
|
#include <stdio.h>
|