Почему 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"
}
Ответы
Ответ 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. Вы не "исправляете" его - так оно и работает.