Написать свой аналог strtok - C (СИ)
Формулировка задачи:
Препод требует сделать свой аналог strtok либо написать программу без него. Я чайник и не особо шарю.\Суть программы - ввести строку и вывести пословно с счетчиком повторений слова.
То есть:
Input: aaa bbb aaa bbb ccc
Output:
aaa = 2
bbb = 2
aaa = 2
bbb = 2
ccc = 1
Решение задачи: «Написать свой аналог strtok»
textual
Листинг программы
char * mystrchr(const char * s, const int c) {
return ( *s ) ? ( ( *s == c ) ? (char*)s : mystrchr(s + 1, c) ) : NULL;
}
char * mystrtok(char * str, const char * delim) {
static char * ptr;
if ( str )
for ( ptr = str; mystrchr(delim, *ptr); ++ptr )
;
if ( *ptr == '\0' )
return NULL;
str = ptr;
while ( *ptr && ! mystrchr(delim, *ptr) )
++ptr;
while ( *ptr && mystrchr(delim, *ptr) )
*ptr++ = '\0';
return str;
}
Объяснение кода листинга программы
- Функция
mystrchrищет первое вхождение символаcв строкеs. Если символ найден, функция возвращает указатель на этот символ. Если символ не найден, функция возвращаетNULL. - Функция
mystrtokявляется аналогом функцииstrtok. Она разбивает строкуstrна токены, используя разделительdelim. - Внутри функции
mystrtokесть статическая переменнаяptr, которая инициализируется значениемstr. - Если
strне равноNULL, то в цикле перебираются символы строкиstr. Если текущий символ является разделителем, то функцияmystrchrвызывается рекурсивно для поиска следующего токена. - Если текущий символ не является разделителем и функция
mystrchrвернулаNULL, то это значит, что текущий символ является последним токеном. В этом случае функция возвращаетNULL. - Если текущий символ не является разделителем и функция
mystrchrвернула неNULL, то это значит, что текущий символ является началом нового токена. В этом случае значениеptrобновляется, чтобы указывать на следующий символ после разделителя. - Если текущий символ является последним символом в строке, то функция возвращает
NULL. - Если текущий символ не является последним символом в строке и не является разделителем, то он добавляется к следующему токену, и значение
ptrобновляется, чтобы указывать на следующий символ. - Если текущий символ является последним символом в строке и не является разделителем, то он добавляется к следующему токену, и значение
ptrобновляется, чтобы указывать на следующий символ. - Если текущий символ является последним символом в строке и является разделителем, то функция возвращает
NULL. - Если текущий символ не является последним символом в строке и является разделителем, то функция возвращает
NULL. - Если текущий символ является последним символом в строке и не является разделителем, то он добавляется к следующему токену, и значение
ptrобновляется, чтобы указывать на следующий символ. - Если текущий символ является последним символом в строке и является разделителем, то функция возвращает
NULL. - Если текущий символ не является последним символом в строке и является разделителем, то функция возвращает
NULL. - Если текущий символ является последним символом в строке и не является разделителем, то он добавляется к следующему токену, и значение
ptrобновляется, чтобы указывать на следующий символ. - Если текущий символ является последним символом в строке и является разделителем, то функция возвращает
NULL. - Если текущий символ не является последним символом в строке и является разделителем, то функция возвращает
NULL. - Если текущий символ является последним символом в строке и не является разделителем, то он добавляется к следующему токену, и значение
ptrобновляется, чтобы указывать на следующий символ. - Если текущий символ является последним символом в строке и является разделителем, то функция возвращает
NULL. - Если текущий символ не является последним символом в строке и является разделителем, то функция возвращает
NULL.