Написать функцию 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;
}
Объяснение кода листинга программы
- В функции mystrchr ищется первое вхождение символа в строке.
- В функции mystrtok реализован механизм разделения строки на токены (слова).
- Первый вызов mystrtok указывает начальную строку для разделения и строку-разделитель.
- В функции mystrtok используется статическая переменная next, которая хранит текущий индекс следующего токена в строке.
- Если разделитель не найден, то возвращается указатель на текущий токен.
- Если все токены уже обработаны, то возвращается NULL.
- В функции main происходит считывание строки с помощью fgets.
- Затем строка передается в функцию mystrtok для разделения на токены.
- Результат выводится на экран.