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);  
}
Другие вопросы по тегам