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