Функции strtok () и strtok_r () в C с примерами

Опубликовано: 4 Декабря, 2021

C предоставляет две функции strtok () и strtok_r () для разделения строки по некоторому разделителю. Разделение строки - очень распространенная задача. Например, у нас есть список элементов из файла, разделенных запятыми, и нам нужны отдельные элементы в массиве.

strtok ()

// Разбивает str [] в соответствии с заданными разделителями.
// и возвращает следующий токен. Это нужно назвать
// в цикле, чтобы получить все токены. Возвращает NULL
// когда токенов больше нет.
char * strtok (char str [], const char * delims);
// AC/C++ program for splitting a string
// using strtok()
#include <stdio.h>
#include <string.h>
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;
}

Выход:

 Компьютерщики
для
Компьютерщики

strtok_r ()
Как и функция strtok () в C, strtok_r () выполняет ту же задачу по синтаксическому анализу строки на последовательность токенов. strtok_r () - это реентерабельная версия strtok ()

Есть два способа вызвать strtok_r ()

// The third argument saveptr is a pointer to a char * 
// variable that is used internally by strtok_r() in 
// order to maintain context between successive calls
// that parse the same string.
char *strtok_r(char *str, const char *delim, char **saveptr);

Ниже приведена простая программа на C, демонстрирующая использование strtok_r ():

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

Выход:

 Компьютерщики
для
Компьютерщики

Другой пример strtok:

// C code to demonstrate working of
// strtok
#include <stdio.h>
#include <string.h>
// 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 delimeter
while (tok != 0) {
printf ( " %s " , tok);
// Use of strtok
// go through other tokens
tok = strtok (0, s);
}
return (0);
}

Выход:

 Компьютерщики
 для
 выродки
 Делать вклад

Практическое применение
strtok можно использовать для разделения строки на несколько строк на основе некоторых разделителей. С помощью этой функции можно реализовать простую поддержку файла CSV. В файлах CSV в качестве разделителей используются запятые.

// C code to demonstrate practical application of
// strtok
#include <stdio.h>
#include <string.h>
// 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 delimeter
const char s[4] = " " ;
char * tok;
// Use of strtok
// get first token
tok = strtok (gfg, s);
// Checks for delimeter
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,

Ссылка:
1) страница руководства strtok_r ()
2) http://stackoverflow.com/questions/15961253/c-correct-usage-of-strtok-r

Эта статья предоставлена MAZHAR IMAM KHAN и shantanu_23. Если вам нравится GeeksforGeeks, и вы хотели бы внести свой вклад, вы также можете написать статью с помощью provide.geeksforgeeks.org или отправить ее по электронной почте на deposit@geeksforgeeks.org. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам.

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.

Хотите узнать о лучших видео и практических задачах, ознакомьтесь с базовым курсом C ++ для базового и продвинутого уровня C ++ и курсом C ++ STL для базового уровня плюс STL. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .