strtok влияет на входной буфер
Я использую strtok для токенизации строки, влияет ли strtok на оригинальный буфер? Например:
*char buf[] = "This Is Start Of life";
char *pch = strtok(buf," ");
while(pch)
{
printf("%s \n", pch);
pch = strtok(NULL," ");
}*
printf("Orignal Buffer:: %s ",buf);
Output is::
This
Is
Start
Of
life
Original Buffer:: This
Я прочитал, что strtok возвращает указатель на следующий токен, тогда как это влияет на buf? Есть ли способ сохранить оригинальный буфер (без дополнительных затрат на копирование)?
Последующий вопрос:: из пока что ответов, я думаю, нет никакого способа сохранить буфер. Так что, если я использую динамический массив для создания исходного буфера, и если strtok собирается повлиять на него, то при освобождении исходного буфера произойдет утечка памяти или strtok позаботится об освобождении памяти?
2 ответа
strtok()
не создает новую строку и не возвращает ее; он возвращает указатель на токен в строке, которую вы передаете в качестве аргумента strtok()
, Поэтому исходная строка будет затронута.
strtok()
разрывает строку означает, что она заменяет delimiter
символ с NULL и возвращает указатель на начало этого токена. Поэтому после запуска strtok()
delim
символы будут заменены на символы NULL. Вы можете прочитать ссылку1 ссылку2.
Как вы можете видеть в выводе примера в link2
, результат, который вы получаете, как и ожидалось, так как delim
персонаж заменяется strtok
,
Когда вы делаете strtok(NULL, "|")
, strtok
находит токен и помещает ноль на место (замените разделитель на '\0'
) и изменяет строку. Таким образом, вам нужно сделать копию исходной строки перед токенизацией.
Пожалуйста, попробуйте следующее:
void main(void)
{
char buf[] = "This Is Start Of life";
char *buf1;
/* calloc() function will allocate the memory & initialize its to the NULL*/
buf1 = calloc(strlen(buf)+1, sizeof(char));
strcpy(buf1, buf);
char *pch = strtok(buf," ");
while(pch)
{
printf("%s \n", pch);
pch = strtok(NULL," ");
}
printf("Original Buffer:: %s ",buf1);
}