Две вещи, которые нужно знать о strtok
. Как уже упоминалось, он «сохраняет внутреннее состояние». Кроме того, он искажает строку, которую вы ему передаете. По сути, он напишет '\0'
, где найдет указанный вами токен, и вернет указатель на начало строки. Внутри он поддерживает местоположение последнего токена; и в следующий раз, когда вы его вызовете, он начнется оттуда.
Важным следствием этого является то, что вы не можете использовать strtok
для строки типа const char* "hello world";
, так как вы получите нарушение прав доступа при изменении содержимого строки const char*
.
«Хорошая» вещь в strtok
заключается в том, что она на самом деле не копирует строки, поэтому вам не нужно управлять дополнительным выделением памяти и т. Д. Но если вы не понимаете вышеизложенное, у вас возникнут проблемы с ее правильным использованием.
Пример - если у вас есть "this,is,a,string", последовательные вызовы strtok
будут генерировать указатели следующим образом (^
- это возвращаемое значение). Обратите внимание, что '\0'
добавляется там, где находятся токены; это означает, что исходная строка изменена:
t h i s , i s , a , s t r i n g \0 this,is,a,string
t h i s \0 i s , a , s t r i n g \0 this
^
t h i s \0 i s \0 a , s t r i n g \0 is
^
t h i s \0 i s \0 a \0 s t r i n g \0 a
^
t h i s \0 i s \0 a \0 s t r i n g \0 string
^
Надеюсь, это имеет смысл.
person
Floris
schedule
13.01.2014
strtok_r()
создали... - person vrdhn   schedule 13.01.2014int main (void)
. - person alk   schedule 13.01.2014