web-dev-qa-db-ja.com

C言語:strtok()を1回使用した後に残りの文字列を取得する方法

私の文字列は「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

ありがとう。

12
Eric Tseng

区切り文字のセットを変更できるため、空の文字列を渡すだけです。

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);
18
Neil

これには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);
}
8
unwind

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);
}

注:これはスレッドセーフではありません。

1
Atle

これを試して:

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);
  }   
}
1
alk

printf( "a:%s\n"、a + 1 + strlen(b));

これを試して

0
nav_jan

strtokを使用する必要がない場合は、区切り文字が1文字であるため、代わりにstrchrを使用できます。

char a[] = "A,B,C,D,E";
char *sep = strchr(a, ',');
*sep = '\0';
puts(a);
puts(sep + 1);
0
Fred Foo