две вещи, чтобы знать о strtok
. Как уже упоминалось, он «поддерживает внутреннее состояние». Кроме того, он испортил строку, которую вы ее подавали. По существу, он напишет '\0'
, где он найдет маркер, который вы предоставили, и возвращает указатель на начало строки. Внутренне он поддерживает расположение последнего токена; и в следующий раз, когда вы его назовете, он начнется оттуда.
Важным следствием является то, что вы не можете использовать strtok
в строке типа const char* "hello world";
, так как вы получите нарушение прав доступа при изменении содержимого строки const char*
.
«Хорошая» вещь о strtok
состоит в том, что она фактически не копирует строки - поэтому вам не нужно управлять дополнительным распределением памяти и т. Д. Но если вы не поймете вышеизложенное, вам будет сложно правильно его использовать.
Пример - если у вас есть «это, есть, строка», последовательные вызовы 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
^
Надеюсь, это имеет смысл.
http://en.cppreference.com/w/c/string/byte/strtok –
"* Я нашел эту программу-образец, которая объясняет функцию strtok *, это не пример, который объясняет, но документацию, поэтому вы можете читайте здесь: http://man7.org/linux/man-pages/man3/strtok.3.html – alk
И это не имеет смысла никому .. поэтому был создан 'strtok_r()' ... – vrdhn