私の文字列は「A、B、C、D、E」です
そして区切り文字は「、」です
strtok()を1回実行した後、残りの文字列、つまり「B、C、D、E」を取得するにはどうすればよいですか。
char a[] = "A,B,C,D,E";
char * separator = ",";
char * b = strtok(a,separator);
printf("a: %s\n", a);
printf("b: %s\n", b);
出力は次のとおりです。
a:A
b:A
しかし、結果を得る方法
a:B、C、D、E
b:A
ありがとう。
区切り文字のセットを変更できるため、空の文字列を渡すだけです。
char a[] = "A,B,C,D,E";
char * separator = ",";
char * b = strtok(a, separator);
printf("b: %s\n", b);
char * c = strtok(NULL, "");
printf("c: %s\n", c);
これにはstrtok()
を使用しないでください。これは、その目的ではないためです。
strchr()
を使用して最初の区切り文字を見つけ、そこから移動します。
char a[] = "A,B,C,D,E";
const char separator = ',';
char * const sep_at = strchr(a, separator);
if(sep_at != NULL)
{
*sep_at = '\0'; /* overwrite first separator, creating two strings. */
printf("first part: '%s'\nsecond part: '%s'\n", a, sep_at + 1);
}
strtok
は、最後に使用した文字列と終了した場所を記憶しています。次の文字列を取得するには、最初の引数としてNULL
を指定して再度呼び出します。
char a[] = "A,B,C,D,E";
const char *separator = ",";
char *b = strtok(a, separator);
while (b) {
printf("element: %s\n", b);
b = strtok(NULL, separator);
}
注:これはスレッドセーフではありません。
これを試して:
char a[] = "A,B,C,D,E";
char * end_of_a = a + strlen(a); /* Memorise the end of s. */
char * separator = ",";
char * b = strtok(a, separator);
printf("a: %s\n", a);
printf("b: %s\n", b);
/* There might be some more tokenising here, assigning its result to b. */
if (NULL != b)
{
b = strtok(NULL, separator);
}
if (NULL != b)
{ /* Get reference to and print remainder: */
char * end_of_b = b + strlen(b);
if (end_of_b != end_of_a) /* Test whether there really needs to be something,
will say tokenising did not already reached the end of a,
which however is not the case for this example. */
{
char * remainder = end_of_b + 1;
printf("remainder: `%s`\n", remainder);
}
}
printf( "a:%s\n"、a + 1 + strlen(b));
これを試して
strtok
を使用する必要がない場合は、区切り文字が1文字であるため、代わりにstrchr
を使用できます。
char a[] = "A,B,C,D,E";
char *sep = strchr(a, ',');
*sep = '\0';
puts(a);
puts(sep + 1);