logo

функції strtok() і strtok_r() у C із прикладами

C надає дві функції strtok() і strtok_r() для розділення рядка деяким роздільником. Розбиття рядка є дуже поширеним завданням. Наприклад, у нас є розділений комами список елементів із файлу, і нам потрібні окремі елементи в масиві.

Функція strtok().

Метод strtok() розділяє str[] відповідно до заданих роздільників і повертає наступний маркер. Його потрібно викликати в циклі, щоб отримати всі маркери. Він повертає NULL, коли маркерів більше немає.



Синтаксис strtok()

char * strtok (char * str , const char * delims );>

Параметри

    str : це вказівник на рядок, який потрібно токенізувати. роздільники : це рядок, що містить усі роздільники.

Повернене значення

  • Він повертає вказівник на перший токен, який зустрічається в рядку.
  • Він повертає NULL, якщо маркерів більше не знайдено.

Приклади strtok()

приклад 1: C Програма для демонстрації того, як розділити рядок за допомогою strtok().

C








// C program for splitting a string> // using strtok()> #include> #include> int> main()> {> >char> str[] =>'Geeks-for-Geeks'>;> >// Returns first token> >char>* token =>strtok>(str,>' - '>);> >// Keep printing tokens while one of the> >// delimiters present in str[].> >while> (token != NULL) {> >printf>(>' % s '>, token);> >token =>strtok>(NULL,>' - '>);> >}> >return> 0;> }>

>

>

Вихід

 Geeks for Geeks>

приклад 2: Програма демонструє використання функції strtok() для токенізації рядка на основі розділювача.

C




// C code to demonstrate working of> // strtok> #include> #include> // Driver function> int> main()> {> >// Declaration of string> >char> gfg[100] =>' Geeks - for - geeks - Contribute'>;> >// Declaration of delimiter> >const> char> s[4] =>'-'>;> >char>* tok;> >// Use of strtok> >// get first token> >tok =>strtok>(gfg, s);> >// Checks for delimiter> >while> (tok != 0) {> >printf>(>' %s '>, tok);> >// Use of strtok> >// go through other tokens> >tok =>strtok>(0, s);> >}> >return> (0);> }>

>

>

Вихід

 Geeks for geeks Contribute>

Практичне застосування strtok()

strtok() можна використовувати, щоб розділити рядок на кілька рядків на основі деяких роздільників. А простий файл CSV підтримка може бути реалізована за допомогою цієї функції. Файли CSV мають коми як роздільники.

приклад 3: C Програма для демонстрації використання функції strtok() у C для реалізації a простий файл CSV.

C




// C code to demonstrate practical application of> // strtok> #include> #include> // Driver function> int> main()> {> >// Declaration of string> >// Information to be converted into CSV file> >char> gfg[100] =>' 1997 Ford E350 ac 3000.00'>;> >// Declaration of delimiter> >const> char> s[4] =>' '>;> >char>* tok;> >// Use of strtok> >// get first token> >tok =>strtok>(gfg, s);> >// Checks for delimiter> >while> (tok != 0) {> >printf>(>'%s, '>, tok);> >// Use of strtok> >// go through other tokens> >tok =>strtok>(0, s);> >}> >return> (0);> }>

>

>

Вихід

1997, Ford, E350, ac, 3000.00,>

Функція strtok_r().

Подібно до функції strtok() у C, strtok_r() виконує те саме завдання розбору рядка на послідовність токенів. strtok_r() є реентерабельною версією strtok(), тому він безпечний для потоків.

Синтаксис strtok_r()

char * strtok_r (char * str , const char * delim , char ** saveptr );>

Параметри

    str : це вказівник на рядок, який потрібно токенізувати. роздільники : це рядок, що містить усі роздільники. saveptr : це вказівник на змінну char *, яка використовується всередині strtok_r() для підтримки контексту між послідовними викликами, які аналізують той самий рядок.

Повернене значення

  • Він повертає вказівник на перший токен, який зустрічається в рядку.
  • Він повертає NULL, якщо маркерів більше не знайдено.

Приклади strtok_r()

приклад 1: Проста програма на C, щоб показати використання strtok_r().

C




// C program to demonstrate working of strtok_r()> // by splitting string based on space character.> #include> #include> int> main()> {> >char> str[] =>'Geeks for Geeks'>;> >char>* token;> >char>* rest = str;> >while> ((token = strtok_r(rest,>' '>, &rest)))> >printf>(>'%s '>, token);> >return> (0);> }>

>

>

Вихід

Geeks for Geeks>

Вкладена токенізація в C

приклад 2: Наведена нижче програма на C демонструє використання функції strtok_r() для вкладеної токенізації.

C




#include> #include> int> main()> {> >char> str[] =>'Hello, World! Geeks for Geeks.'>;> >const> char> outer_delimiters[] =>'!.'>;> >const> char> inner_delimiters[] =>' ,'>;> >char>* token;> >char>* outer_saveptr = NULL;> >char>* inner_saveptr = NULL;> >token = strtok_r(str, outer_delimiters, &outer_saveptr);> >while> (token != NULL) {> >printf>(>'Outer Token: %s '>, token);> >char>* inner_token = strtok_r(> >token, inner_delimiters, &inner_saveptr);> >while> (inner_token != NULL) {> >printf>(>'Inner Token: %s '>, inner_token);> >inner_token = strtok_r(NULL, inner_delimiters,> >&inner_saveptr);> >}> >token = strtok_r(NULL, outer_delimiters,> >&outer_saveptr);> >}> >return> 0;> }>

>

>

Вихід

Outer Token: Hello, World Inner Token: Hello Inner Token: World Outer Token: Geeks for Geeks Inner Token: Geeks Inner Token: for Inner Token: Geeks>

Різниця між strtok() і strtok_r()

Розглянемо відмінності між функціями strtok() і strtok_r() у табличній формі, як показано нижче:

Так ні.

strtok()

strtok_r()

1.

Він використовується для розбиття рядка str на серію токенів. Він використовується для декодування рядка в шаблон для токенів.

2.

Синтаксис такий:

char *strtok(char *str, const char *delim)

cdr повна форма
Його синтаксис такий:
char *strtok_r(char *string, const char *limiter, char **context);

3.

Для продовження використовується роздільник. Це повторно введений варіант strtok().

4.

Він приймає два параметри. Він приймає три параметри.

5.

Він повертає вказівник на перший токен, знайдений у рядку. Він повертає вказівник на перший токен, знайдений у рядку.
6. Це небезпечно для потоків. Це потокобезпечно.