Написать функцию strtok вручную - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Народ, помогите плиз... в задании надо описать функцию strtok вручную, как она по сути должна работать. у меня вышло, что из строки, которую я ввожу он выписывает только первое слово, на остальные плюет, чего у меня не хватает? можете дополнить?
#include <stdio.h>
#include <string.h>
#include <conio.h>
 
char ptr[100];
 
char* strtok1(char* ptr1, char* ptr2)
{
    char s;
    int i=0,j=0,t=0,k=0;
    int is_letter = 1;
    memset(ptr, 0, 100);
 
    for (; *ptr1 != '\0'; ptr1++)
    {
        s=*ptr1;
        for (j=0;j<5;j++)
        {
            if (s!=ptr2[j] && is_letter)
                is_letter = 1;
            else
                is_letter = 0;
        }
 
        if(is_letter)
        {
            ptr[t] = s;
            t++;
        }
        else return ptr1+1;
    }
 
    return ptr1;
}
 
int main()
{
    char ptr1[100], ptr2[6]={" .,?!"};
    char* p = ptr1;
 
    puts("Enter a string:" );
    gets(ptr1);
 
    p = strtok1(ptr1, ptr2);
    printf("%s\n", ptr, p);
    /*p = strtok1(p, ptr2);
    printf("%s \n", ptr, p);
    p = strtok1(p, ptr2);
    printf("%s \n", ptr, p);*/
    return 0;
 
    while (ptr1 != '\0')
    {
        p=strtok1(p, ptr2);
        if (*ptr1 != '\0')
        {
            printf("%s\n", p);
        }
        else break;
    }
    getch();
    return 0; 
}

Решение задачи: «Написать функцию strtok вручную»

textual
Листинг программы
#include <stdio.h>
 
char * mystrchr(const char * s, const char c) {
    while ( *s && *s != c )
        ++s;
    return ( *s ) ? (char*) s : NULL;
}
 
char * mystrtok(char * str, const char * delim) {
    static char * next;
    
    if ( str ) {
        next = str;
        while ( *next && mystrchr(delim, *next) )
            *next++ = '\0';
    }
    
    if ( ! *next )
        return NULL;
    
    str = next;
    
    while ( *next && ! mystrchr(delim, *next) )
        ++next;
    while ( *next && mystrchr(delim, *next) )
        *next++ = '\0';
    
    return str;
}
 
#define DELIM " \t\n"
 
int main(void) {
    char buf[BUFSIZ], * p;
    
    while ( printf("String: ") && fgets(buf, BUFSIZ, stdin) && *buf != '\n' && printf("By words:\n") )
        for ( p = mystrtok(buf, DELIM); p; p = mystrtok(NULL, DELIM) )
            printf("%s\n", p);
    
    return 0;
}

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

  1. В функции mystrchr ищется первое вхождение символа в строке.
  2. В функции mystrtok реализован механизм разделения строки на токены (слова).
  3. Первый вызов mystrtok указывает начальную строку для разделения и строку-разделитель.
  4. В функции mystrtok используется статическая переменная next, которая хранит текущий индекс следующего токена в строке.
  5. Если разделитель не найден, то возвращается указатель на текущий токен.
  6. Если все токены уже обработаны, то возвращается NULL.
  7. В функции main происходит считывание строки с помощью fgets.
  8. Затем строка передается в функцию mystrtok для разделения на токены.
  9. Результат выводится на экран.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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