Написать свой аналог 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;
}

Объяснение кода листинга программы

  1. Функция mystrchr ищет первое вхождение символа c в строке s. Если символ найден, функция возвращает указатель на этот символ. Если символ не найден, функция возвращает NULL.
  2. Функция mystrtok является аналогом функции strtok. Она разбивает строку str на токены, используя разделитель delim.
  3. Внутри функции mystrtok есть статическая переменная ptr, которая инициализируется значением str.
  4. Если str не равно NULL, то в цикле перебираются символы строки str. Если текущий символ является разделителем, то функция mystrchr вызывается рекурсивно для поиска следующего токена.
  5. Если текущий символ не является разделителем и функция mystrchr вернула NULL, то это значит, что текущий символ является последним токеном. В этом случае функция возвращает NULL.
  6. Если текущий символ не является разделителем и функция mystrchr вернула не NULL, то это значит, что текущий символ является началом нового токена. В этом случае значение ptr обновляется, чтобы указывать на следующий символ после разделителя.
  7. Если текущий символ является последним символом в строке, то функция возвращает NULL.
  8. Если текущий символ не является последним символом в строке и не является разделителем, то он добавляется к следующему токену, и значение ptr обновляется, чтобы указывать на следующий символ.
  9. Если текущий символ является последним символом в строке и не является разделителем, то он добавляется к следующему токену, и значение ptr обновляется, чтобы указывать на следующий символ.
  10. Если текущий символ является последним символом в строке и является разделителем, то функция возвращает NULL.
  11. Если текущий символ не является последним символом в строке и является разделителем, то функция возвращает NULL.
  12. Если текущий символ является последним символом в строке и не является разделителем, то он добавляется к следующему токену, и значение ptr обновляется, чтобы указывать на следующий символ.
  13. Если текущий символ является последним символом в строке и является разделителем, то функция возвращает NULL.
  14. Если текущий символ не является последним символом в строке и является разделителем, то функция возвращает NULL.
  15. Если текущий символ является последним символом в строке и не является разделителем, то он добавляется к следующему токену, и значение ptr обновляется, чтобы указывать на следующий символ.
  16. Если текущий символ является последним символом в строке и является разделителем, то функция возвращает NULL.
  17. Если текущий символ не является последним символом в строке и является разделителем, то функция возвращает NULL.
  18. Если текущий символ является последним символом в строке и не является разделителем, то он добавляется к следующему токену, и значение ptr обновляется, чтобы указывать на следующий символ.
  19. Если текущий символ является последним символом в строке и является разделителем, то функция возвращает NULL.
  20. Если текущий символ не является последним символом в строке и является разделителем, то функция возвращает NULL.

Оцени полезность:

8   голосов , оценка 4.375 из 5
Похожие ответы