Ошибка в функции strtok в C - PullRequest
4 голосов
/ 07 июня 2011

Я использую простую программу для токенизации строки с использованием функции strtok.Вот код -

# include <stdio.h>
char str[] = "now # time for all # good men to # aid of their country";   //line a
char delims[] = "#";
char *result = NULL;
result = strtok( str, delims );
while( result != NULL ) {
    printf( "result is \"%s\"\n", result );
    result = strtok( NULL, delims );
}

Программа успешно работает.Однако, если строка a изменяется на

char * str= "now # time for all # good men to # aid of their country";   //line a 

Функция strtok дает дамп памяти.Я хотел бы получить объяснение моего понимания, почему это так?Потому что из объявления strtok как --char * strtok (char * str1, const char * str2);char * str в качестве первого аргумента должен работать

Ответы [ 3 ]

6 голосов
/ 07 июня 2011

char *str = "foo" дает вам указатель на строковый литерал (вы действительно должны делать const char *, но C допускает не-const по причинам обратной совместимости).

Неопределенное поведение пытаться изменить строковый литерал. strtok изменяет свой ввод.

5 голосов
/ 07 июня 2011

Вы не можете изменить строковый литерал. ЧаВо по теме объясняет это лучше всего. В двух словах, если вы объявите

char *stuff = "Read-only stuff";

Вы не можете изменить его.

Тот факт, что strtok принимает char *, связан с тем, что вы не можете передавать массивы в функции , вы можете только передавать адреса. Здесь может помочь еще одна запись c faq .

1 голос
/ 07 июня 2011

Предыдущие ответы дают требуемый ответ, но дополнительную информацию: Вы можете рассмотреть возможность использования strdup () для создания дубликата строки, который вы МОЖЕТЕ затем использовать в strtok ().Просто сохраните указатель на исходный возвращенный буфер, так как вам нужно будет освободить () его, когда закончите с тем, что он ошибочен.

...