Согласно функции , документации , правильное использование функции
это первое, что вы упомянули.
Дальнейшие цитаты из стандарта C11 (выделено мое), раздел K.3.7.3.1 (стр. 616):
Последовательность вызовов функции strtok_s разбивает строку, указанную s1, в
последовательность токенов, каждый из которых ограничен символом из строки, указанной на
по s2. Четвертый аргумент указывает на предоставленный вызывающим указатель на символ, в который
Функция strtok_s хранит информацию, необходимую для продолжения сканирования.
строка .
Первый вызов в последовательности имеет ненулевой первый аргумент , а s1max указывает на объект
значение которого равно количеству элементов в массиве символов, указанном первым
аргумент. Первый вызов сохраняет начальное значение в объекте, на который указывает ptr и
обновляет значение, на которое указывает s1max, для отражения количества элементов, которые остаются в
отношение к ptr. Последующие вызовы в последовательности имеют нулевой первый аргумент, а
объекты, на которые указывают s1max и ptr, должны иметь значения, хранящиеся в
предыдущий вызов в последовательности, которые затем обновляются . Строка разделителя, на которую указывает
s2 может отличаться от звонка к звонку.
Таким образом, стандарт говорит, что правильное использование заключается в том, чтобы вызывать strtok_s
с ненулевым первым аргументом, а затем вызывать его с пустым первым аргументом. При первом вызове функция инициализирует некоторое состояние и использует предоставленный указатель (последний аргумент) для его сохранения.
Стандарт не упоминает, как следует использовать последний аргумент, вместо того, чтобы хранить состояние, чтобы функция могла продолжить поиск той же строки при вызове с неизмененным указателем. В основном это устраняет необходимость во внутреннем состоянии strtok
, так что вы можете, например, токенизировать несколько строк одновременно.
Способ использования пространства состояний, таким образом, определяет реализацию . Вполне может быть, что в некоторых реализациях он просто помещает туда начальную строку и всегда вызывает ее с первым аргументом NULL, как вы показали. Но нет никакой гарантии, что это произойдет во всех реализациях или что такое поведение останется таким же в будущих версиях библиотеки.
Чтобы прямо ответить на ваш вопрос, да, это может сработать, но нет, это не очень хорошая идея.