strtok
плохой гражданин.
Во-первых, он сохраняет состояние, которое вы неявно использовали при вызове strtok(NULL,...)
- это состояние сохраняется в частной памяти библиотеки Standard C, что означает, что только однопоточные программы могут использовать strtok
, Обратите внимание, что в некоторых библиотеках существует реентерабельная версия с именем strtok_r
.
Для другого и для ответа на ваш вопрос strtok
изменяет свой ввод. Он не выделяет место для строк; он записывает NUL-символы вместо разделителя во входной строке и возвращает указатель на входную строку.
Вы правы, что strtok
может вернуть более 10 результатов. Вы должны проверить это в своем коде, чтобы не писать после конца tokens
. Надежная программа либо установит верхний предел, например, 10
, и проверит его, сообщит об ошибке, если она превышена, либо динамически выделит массив tokens
с помощью malloc
, и realloc
, если получит слишком много большой. Тогда ошибка возникает, когда вам не хватает памяти.
Обратите внимание, что вы также можете обойти проблему strtok
изменения входной строки с помощью strdup
ing перед передачей ее strtok
. Затем вам нужно будет освободить новую строку после того, как она и tokens
, которые указывают на нее, выйдут за пределы области.