Подтвердить что ты не робот

Почему strtok меняет свой вход так?

Итак, я понимаю, что strtok изменяет свой входной аргумент, но в этом случае он сворачивает входную строку только в первый токен. Почему это происходит, и что я могу сделать, чтобы исправить это? (Обратите внимание: я не говорю о переменной "temp", которая должна быть первым токеном, а скорее переменной "input", которая после одного вызова strtok становится "this")

#include <string.h>
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char* argv[]) {
   char input[]="this is a test of the tokenizor seven";
   char * temp;
   temp=strtok(input," ");
   printf("input: %s\n", input); //input is now just "this"
}
4b9b3361

Ответ 1

Когда strtok() находит токен, он меняет символ сразу после токена в \0, а затем возвращает указатель на токен. В следующий раз, когда вы вызываете его с помощью аргумента NULL, он начинает искать разделители, которые завершили первый токен, т.е. После \0 и, возможно, дальше.

Теперь исходный указатель на начало строки по-прежнему указывает на начало строки, но первый токен теперь \0 -terminated - т.е. printf() думает, что конец токена - это конец строки. Остальные данные все еще существуют, но \0 останавливает printf(), показывая это. Если вы использовали for -loop для перемещения по исходной строке ввода до исходного количества символов, вы обнаружите, что данные все еще там.

Ответ 2

Вы должны распечатать маркер, который вы получаете от strtok, и не беспокоиться о входном массиве, потому что NULL будут вставлены в strtok. Вам нужны повторные вызовы для получения всех токенов:

#include <string.h>
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char* argv[]) {
  char input[]="this is a test of the tokenizor seven";
  char * temp;
  temp=strtok(input," ");
  while( temp != NULL ) {
    printf("temp is \"%s\"\n", temp );
    temp = strtok( NULL, " ");
  }
}

Ответ 3

Это потому, что strtok вставляет нули в каждый разделитель, поэтому вы используете повторные вызовы strtok для получения каждого токена. Строка ввода не может быть использована, как только вы начнете использовать strtok. Вы не "исправляете" его - так оно и работает.