Написать свой аналог 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д