Как разделить строки на основе разделителя в C?

Системный вызов Waitpid на C Программирование и разработка

Строка представляет собой массив символов, а разделителем может быть любой массив символов или любой специальный символ, который можно использовать для разделения строки на несколько подстрок. Разделитель будет частью строки. Мы рассмотрим пример реализации, а также реализуем некоторый фрагмент кода C для разделения строки.

Строка: Строка представляет собой массив символов. Несколько примеров строк:

“New Delhi is Capital of India”

“Bob is studying in Stanford University”

Разделитель: любой символ или набор символов может рассматриваться как разделитель. Если строка должна быть разделена на основе разделителя, то разделитель должен быть частью строки, иначе выходной строкой будет полная строка.

Обычно используемые примеры разделителей: » » (пробел),,(запятая), ’\n’(новая строка) и многие другие.

Разделение строки на основе разделителя

Давайте рассмотрим примерную строку как «Лиса живет в лесу» и разделитель как » » (пробел), тогда строка будет разделена на несколько строк. Несколько строк после разделения будут «Fox», «lives», «in», «woods».

Итак, теперь мы разобрались с концепцией разделения, а также с определением строки и разделителя. Приступим к изучению реализации расщепления в C.

Стандартная функция C для разделения на основе разделителя

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

Прототип функции:

char *strtok(char *restrict <em>str</em>, const char *restrict <em>delim</em>);

Заголовок, который необходимо включить:

#include <string.h>

Программа C для разделения строки на основе разделителя с использованием strtok()

#include
#include
int main()
{
char string[] = «Bob is studying in Stanford University»;
char *delim = » «;
unsigned count = ;
/* First call to strtok should be done with string and delimiter as first and second parameter*/
char *token = strtok(string,delim);
count++;

/* Consecutive calls to the strtok should be with first parameter as NULL and second parameter as delimiter
* * return value of the strtok will be the split string based on delimiter*/

while(token != NULL)
{
printf(«Token no. %d : %s \n«, count,token);
token = strtok(NULL,delim);
count++;
}
return ;
}

Вывод программы:

Теперь давайте обсудим нашу собствен

Теперь давайте обсудим нашу собственную реализацию разделения строки на основе разделителя без использования стандартной функции C (strtok()).

Мы должны искать наличие разделителя в строке и можем вернуть адрес первого символа токена строки непосредственно перед разделителем.

Функция C для поиска токена на основе разделителя может быть реализована следующим образом:

char *search_token(char *string, char *delim)
{
static char *remember = NULL;
int string_length = ;
int i= ;
int search_hit=;

if(delim == NULL)
return NULL;
if((string == NULL) && (remember == NULL))
return NULL;
if(string == NULL)
string = remember;
string_length = strlen(string) + 1;
for(i=;i<string_length;i++)
{
if(string[i] == delim[])
{
search_hit = 1 ;
break;
}
}
if(search_hit != 1)
{
remember = NULL;
return string;
}
string[i] = \0;
if((string+i+1) != NULL)
remember = string + i + 1;
else
remember = NULL;
return string;
}

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

Полная программа на C с нашей реализацией будет выглядеть так:

#include
#include
char *search_token(char *string, char *delim)
{
static char *remember = NULL;
int string_length = ;
int i= ;
int search_hit=;

if(delim == NULL)
return NULL;
if((string == NULL) && (remember == NULL))
return NULL;
if(string == NULL)
string = remember;
string_length = strlen(string) + 1;
for(i=;i<string_length;i++)
{
if(string[i] == delim[])
{
search_hit = 1 ;
break;
}
}
if(search_hit != 1)
{
remember = NULL;
return string;
}
string[i] = \0;
if((string+i+1) != NULL)
remember = string + i + 1;
else
remember = NULL;
return string;
}

int main()
{
char string[] = «Bob is studying in Stanford University»;
char *delim = » «;
unsigned count = ;
char *token;
printf(«Full String = %s \n«,string);
/* First call to search_toekn should be done with string and delimiter as first and second parameter*/
token = search_token(string,delim);
//      printf(«Token no. %d : %s \n»,count, token);
count++;
/* Consecutive calls to the strtok should be with first parameter as NULL and second parameter as delimiter
* * return value of the strtok will be the split string based on delimiter*/

while(token != NULL)
{
printf(«Token no. %d : %s \n«, count,token);
token = search_token(NULL,delim);
count++;
}
return ;
}

Вывод из приведенной выше программы с тем же набором входных данных, что и для стандартной функции C strtok:

bash4.2$ ./a.out

Full String = Bob is studying in Stanford University

Token no. 1 : Bob

Token no. 2 : is

Token no. 3 : studying

Token no. 4 : in

Token no. 5 : Stanford

Token no. 6 : University

bash4.2$

Выходной снимок:

ор мы обсуждали разделение

Заключение

До сих пор мы обсуждали разделение строки на основе разделителя. Для этого уже есть доступные библиотечные способы. Библиотечная функция, которую можно использовать для разделения строки на основе разделителя, — это strtok. Мы взяли пример использования, чтобы понять библиотечную функцию strtok. Кроме того, мы написали пример программы, чтобы понять, как использовать библиотечные функции.

Во второй части мы реализовали собственный метод разделения строки на основе разделителя. Мы написали функцию, похожую на функцию C strtok. Объяснение функционирования пользовательской функции было предоставлено и продемонстрировано с помощью той же основной функции, которая была взята в случае функции библиотеки C. Пример вывода программы также предоставляется вместе с программой-примером.

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

Читайте также:  Карта Pandas DataFrame
Оцените статью
bestprogrammer.ru
Добавить комментарий

Adblock
detector