функції 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) | Його синтаксис такий: char *strtok_r(char *string, const char *limiter, char **context); |
| 3. | Для продовження використовується роздільник. | Це повторно введений варіант strtok(). |
| 4. | Він приймає два параметри. | Він приймає три параметри. |
| 5. | Він повертає вказівник на перший токен, знайдений у рядку. | Він повертає вказівник на перший токен, знайдений у рядку. |
| 6. | Це небезпечно для потоків. | Це потокобезпечно. |