Strtok s c как работает
Перейти к содержимому

Strtok s c как работает

  • автор:

Функция strtok

Функция strtok выполняет поиск лексем в строке string . Последовательность вызовов этой функции разбивают строку string на лексемы, которые представляют собой последовательности символов, разделенных символами разделителями.

На первый вызов, функция принимает строку string в качестве аргумента, чей первый символ используется в качестве начальной точки для поиска лексем. В последующие вызовы, функция ожидает нулевого указателя и использует позицию сразу после окончания последней лексемы как новое местонахождение для сканирования.

Для определения начала лексемы функция сначала определяет символы, не содержащиеся в строке delim , то есть они являются символами разделителями. А затем посимвольно проверяет остальную часть строки до первого символа-разделителя, который сигнализирует конец лексемы.

Этот конечный маркер автоматически заменяется нулевым символом, и лексема возвращается функцией. После этого, следующие вызовы функции strtok начинаются с этого нулевого символа.

Параметры:

  • string
    Строка для поиска в ней лексем. Содержание этой строки будет изменено, она разбивается на более мелкие строки (лексемы). Данный параметр может содержать нулевой указатель, в этом случае функция продолжает сканирование с того места, где был остановлен предыдущий успешный вызов функции.
  • delim
    Строка, содержащая разделители. Они могут варьироваться от одного вызова к другому вызову функции.

Возвращаемое значение

Указатель на последнюю найденную лексему в строке.
Возвращается пустой указатель, если нет найденных лексем.

Русские Блоги

Разница между функциями резки строк strtok, strtok_s, strtok_r

функция strtok

Головной файл: #include <string.h>
Функциональный прототип: char * strtok (char *str, const char * delimiters);
параметрstr: Строка для разделения (c-строка);delimiters: Разделить строку символов.
Эта функция используется для разделения строки на сегменты. Параметр str указывает на строку символов, которая должна быть разделена, а разделители параметров ссылаются на все символы, содержащиеся в строке разделенных символов.Когда strtok () находит символ разделения, содержащийся в разделителях параметров в строке параметра s, он заменяет символ на символ \ 0.В первом вызове strtok () должен дать строку параметра s, а последующие вызовы установят для параметра s значение NULL. Каждый успешный вызов возвращает указатель на сегмент, который был разделен.
должны знать, что этоПри использовании этой функции для разбиения строки она разрушит целостность разложенной строки. Значения до и после вызова уже различны.После первого разбиения исходная строка str является первой строкой после завершения разбиения, а оставшаяся строка сохраняется в статической переменной, поэтому, когда несколько потоков одновременно получают доступ к статической переменной, возникает ошибка.

Пример кода

Пример 1: Разделить строку символов на ‘,’, напечатать подстроку и определить, изменилась ли исходная строка символов (разделенная строка символов)

Выходной результат
before strtok: str=ab,cd,ef
begin:
str=ab
ptr=ab
str=ab
ptr=cd
str=ab
ptr=ef

Пример 2: пример MSDN, строка содержит несколько разделителей

Выходной результат
A string of ,,tokens
and some more tokens

Tokens:
A
string
of
tokens
and
some
more
tokens

в заключении: Процесс сокращения строки strtok фактически заменяет символы разделителя строки разделения на‘\0’ И вернуть первый адрес помеченной строки до конца возврата NULL.

Принцип реализации функции Стокок

Код функции

Выходной результат:
hello boy this is heima hello

функция strtok_s

strtok_s — это функция безопасности с разделенной строкой в ​​Windows и ее прототип
char *strtok_s( char *strToken, const char *strDelimit, char **buf);
Номер сохраняет оставшиеся символьные строки в переменной buf вместо статической переменной, обеспечивая безопасность.

Пример кода

Пример 1. Использование функции strtok_s для разделения строк

Выходной результат
before strtok: str=ab,cd,ef
begin:
str=ab
ptr=ab
str=ab
ptr=cd
str=ab
ptr=ef

функция strtok_r

Функция strtok_s — это безопасная функция для разбиения строк в Linux. Объявление функции выглядит следующим образом:
char *strtok_r(char *str, const char *delim, char **saveptr);
(1) Эта функция также разрушает целостность строки с разложением, но сохраняет оставшуюся строку в переменной saveptr, обеспечивая безопасность.
(2) Оставшаяся строка в функции strtok хранится в статической переменной, поэтому многопоточность вызывает конфликты при использовании статической переменной; strtok_r использует указатель, переданный пользователем Повторно примените переменные для каждого пользователя saveptr, чтобы обеспечить безопасность потоков.
(3)Функция strtok_r является реентерабельной версией функции strtok, то есть поточно-ориентированной версией, str — строка символов, которая должна быть разложена, а delim — строка символов разделителя. голец* Параметр Saveptr является указателем на символПеременная-указатель используется для сохранения контекста разделения в strtok_r для разложения той же строки источника в ответ на последовательные вызовы.

Пример кода

Выходной результат
strtok_r.c

Expand:
Реентерабельная функция:
(1) Повторный вход означает повторный ввод. Во-первых, это означает, что функция может быть прервана, а во-вторых, она не зависит от какой-либо среды (включая статическую), за исключением использования переменных в своем собственном стеке. ), такая функция является чистым кодом (чистый код), может повторно запускать несколько копий функции, потому что они используют отдельный стек, поэтому они не будут мешать друг другу. Если вам нужен доступ к глобальным переменным (включая статические), вы должны обратить внимание на реализацию взаимного исключения. Повторно вводимые функции очень важны в средах с параллельной работой, но, как правило, им приходится платить некоторые издержки производительности за доступ к глобальным переменным.
(2) относится к функции (процессу), которая может быть вызвана несколькими задачами. При вызове задачи не нужно беспокоиться о том, будут ли данные работать неправильно.
Не реентерабельная функция:
Если переменная статического типа хранения определена и используется в блоке реализации кода интерфейса функции, эта функция не будет функцией с повторным входом. Это небезопасная функция в системах реального времени.

strtok, strtok_s

Возвращает указатель на начало следующего маркера или нулевой указатель,если маркеров больше нет.

Эта функция деструктивна: она записывает символы ‘\0’ в элементах строки str . В частности, строковый литерал нельзя использовать в качестве первого аргумента strtok .

Каждый вызов strtok изменяет статическую переменную: не является потокобезопасным.

В отличие от большинства других токенизаторов, разделители в strtok могут отличаться для каждого последующего токена и даже могут зависеть от содержимого предыдущих токенов.

Функция strtok_s отличается от функции POSIX strtok_r защитой от сохранения за пределами размечаемой строки и проверкой ограничений времени выполнения. strtok_s Microsoft CRT соответствует этому определению POSIX strtok_r ,а не strtok_s C11 .

strtok, strtok_s

Returns pointer to the beginning of the next token or a null pointer if there are no more tokens.

[edit] Note

This function is destructive: it writes the ‘ \0 ‘ characters in the elements of the string str . In particular, a string literal cannot be used as the first argument of strtok .

Each call to strtok modifies a static variable: is not thread safe.

Unlike most other tokenizers, the delimiters in strtok can be different for each subsequent token, and can even depend on the contents of the previous tokens.

The strtok_s function differs from the POSIX strtok_r function by guarding against storing outside of the string being tokenized, and by checking runtime constraints. The Microsoft CRT strtok_s signature matches this POSIX strtok_r definition, not the C11 strtok_s .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *