strtok () проблема с получением первого токена строки - PullRequest
1 голос
/ 12 июля 2011

Следующий код не может получить мне первый токен строки:

char *p1;
char array[100];
strcpy(array, "ANY STRING WOULD DO");
p1 = strtok(array, " ");
p1 = strtok(NULL, " ");
p1 = strtok(array, " ");
p1 = strtok(NULL, " ");

printf("%c", p1);

Ответы [ 5 ]

5 голосов
/ 12 июля 2011

strtok() фактически заменяет разделители литералом '\ 0' - фактически записывая поверх вашей исходной строки.Второй раз, когда вы звоните strtok(array, "");, array теперь выглядит как

ANY '\ 0'STRING' \ 0'WOULD DO

(например, если вы печатаете строку, выпросто бы увидеть «ЛЮБОЙ»)

Поскольку strtok не выходит за пределы конца строки, вы получите только один токен во второй раз, и вызов strtok(NULL, " "); вернет NULL.Чтобы решить вашу проблему, вам нужно либо скопировать строку в другое место для второго набора операций, либо сохранить временный указатель строки.

1 голос
/ 12 июля 2011

strtok() на самом деле изменяет строку, в которой вы ищете токены, добавляя к ней символы с нулем ('\ 0'), когда он находит конец токена.Таким образом, после итерации он больше не является непрерывной строкой в ​​памяти.Вот почему вы не можете начать сначала и заново проанализировать строку для токенов.

Возможно, у вас есть два варианта:

  • сделать копию первой строки и токенизируйте, что вместо этого

    char *p1; char array[100]; strcpy(array, "ANY STRING WOULD DO");
    
    char tmp[100];
    strcpy( tmp, array );
    p1 = strtok(tmp, " ");
    p1 = strtok(NULL, " ");
    
    strcpy( tmp, array );
    p1 = strtok(tmp, " ");
    p1 = strtok(NULL, " ");
    
    printf("%c", p1);
    
  • или вы можете оставить массив указателей на отдельные токены по мере их нахождения и повторно использовать массив, скореечем перезвонить strtok().

1 голос
/ 12 июля 2011

Помните, что strtok изменяет строку, помещая '\0' символов после каждого токена.

Таким образом, когда вы снова пытаетесь токенизировать ту же строку, вы действительно токенизируете только первый токен.

Это приведет к тому, что второй p1 = strtok(NULL, " "); вернет NULL, а когда вы попытаетесь вывести p1, он попытается разыменовать NULL и, возможно, потерпит неудачу.

Обратите внимание, что вам нужно использовать "%s" вместо "%c", потому что вы печатаете строку, а не символ.

1 голос
/ 12 июля 2011

Это будет работать:

char *p1;
char array[100];
strcpy(array, "ANY STRING WOULD DO");
p1 = strtok(array, " ");
p1 = strtok(NULL, " ");
strcpy(array, "ANY STRING WOULD DO");
p1 = strtok(array, " ");

printf("%s", p1);

strtok изменяет передаваемую строку, поэтому, если вы хотите повторно проанализировать ее, вам необходимо скопировать ее снова.

Если вы просто хотите сохранить токены, просто скопируйте указатели.

1 голос
/ 12 июля 2011

Пожалуйста, посмотрите на приведенный здесь пример: MSDN: strtok, wcstok, _mbstok

...