strtok()
;でそれを行うことはできません。strtok_r()
POSIXまたはstrtok_s()
Microsoft(利用可能な場合)から使用するか、設計を再考してください。
char *strtok_r(char *restrict s, const char *restrict sep,
char **restrict lasts);
char *strtok_s(char *strToken, const char *strDelimit, char **context);
これらの2つの機能は交換可能です。
バリアントstrtok_s()
はC11のオプション部分で指定されていることに注意してください(ISO / IEC 9899:2011の付録K)。ただし、Microsoft以外のサプライヤの中には、標準のそのセクションにインターフェイスを実装しているものはほとんどありません。Annex Kで指定されているバージョンはstrtok_s()
、Microsoftのものとは異なるインターフェイスを備えています。strtok_s()
同様の問題が、AnnexKで指定されている他の多くの機能を悩ませています。
strtok_r()を使用
#include <string.h>
#include <stdio.h>
int main(void)
{
char str[] = "a;b;c;d;e\nf;g;h;i;j\n1;2;3;4;5\n";
char *end_str;
char *token = strtok_r(str, "\n", &end_str);
while (token != NULL)
{
char *end_token;
printf("a = %s\n", token);
char *token2 = strtok_r(token, ";", &end_token);
while (token2 != NULL)
{
printf("b = %s\n", token2);
token2 = strtok_r(NULL, ";", &end_token);
}
token = strtok_r(NULL, "\n", &end_str);
}
return 0;
}
結果
a = a;b;c;d;e
b = a
b = b
b = c
b = d
b = e
a = f;g;h;i;j
b = f
b = g
b = h
b = i
b = j
a = 1;2;3;4;5
b = 1
b = 2
b = 3
b = 4
b = 5
strtok_r()なし
これはコンテキストで機能します-データが改行で終わる場合。
#include <string.h>
#include <stdio.h>
int main(void)
{
char data[] = "a;b;c;d;e\nf;g;h;i;j\n1;2;3;4;5\n";
char *string = data;
char *token = strchr(string, '\n');
while (token != NULL)
{
/* String to scan is in string..token */
*token++ = '\0';
printf("a = %s\n", string);
char *token2 = strtok(string, ";");
while (token2 != NULL)
{
printf("b = %s\n", token2);
token2 = strtok(NULL, ";");
}
string = token;
token = strchr(string, '\n');
}
return 0;
}
出力
a = a;b;c;d;e
b = a
b = b
b = c
b = d
b = e
a = f;g;h;i;j
b = f
b = g
b = h
b = i
b = j
a = 1;2;3;4;5
b = 1
b = 2
b = 3
b = 4
b = 5