Остерегайтесь strtok()
; это не повторный вход. Среди прочего, это означает, что если вам нужно вызвать ее в одной функции, а затем вызвать другую функцию, и если эта другая функция также использует strtok()
, ваша первая функция испорчена. Он также записывает NUL ('\0'
) байтов через разделители, поэтому он изменяет входную строку по мере ее поступления. Если вы ищете более одного символа-терминатора, вы не можете сказать, какой из них был найден. Кроме того, если вы пишете библиотечную функцию для использования другими, но ваша функция использует strtok()
, вы должны задокументировать тот факт, что вызывающие вас функции не будут смущены сбоями их собственного кода, strtok()
после вызова вашей функции. Другими словами, это ядовито; если ваша функция вызывает strtok()
, это делает вашу функцию неиспользуемой, в общем; аналогично, ваш код, который использует strtok()
, не может вызывать функции других людей, которые также используют его.
Если вам все еще нравится идея функциональности - некоторым это нравится (но я почти всегда избегаю ее) - тогда поищите strtok_r()
в вашей системе. Это повторно входящий; он принимает дополнительный параметр, который означает, что другие функции могут использовать strtok_r()
(или strtok()
), не влияя на вашу функцию.
Существует множество альтернатив, которые могут быть уместны. Очевидные для рассмотрения следующие: strchr()
, strrchr()
, strpbrk()
, strspn()
, strcspn()
: ни один из них не изменяет анализируемые строки. Все они являются частью стандарта C (как и strtok()
), поэтому они в основном доступны везде. Поиск материала до того, как один символ предлагает использовать strchr()
.