strtok



Strtok s

Автор Bhws mkt задал вопрос в разделе Другие языки и технологии

Вопрос по функции Си strtok. Никак не могу разобраться как она работает... и получил лучший ответ

Ответ от Личный Кабинет Удален[гуру]
Добрый вечер!
Постарался рассказать об этой функции максимально кратко и понятно (а главное - по-русски) :
1. Функция strtok() позволяет разбить строку на части с использованием заданных разделителей.
На практике эту функцию удобно использовать, например, для ввода даты, когда надо выделить день, месяц и год, разделённые точкой.
2. Как и большинство других функций для работы со строками, хранится в заголовочном файле <string.h>.
То есть в начало кода нужно добавить
#include <string.h>
3. Сам синтаксис strtok():
char *strtok(char *str, const char *sep);
Первый аргумент - указатель на строку, которую нужно разбить на части.
Второй аргумент - указатель на строку, содержащую набор символов-разделителей.
Возвращает указатель на полученную в итоге лексему.
4. Функция strtok() выделяет очередную часть строки str, отделенную одним из символов разделителей sep. Последовательный вызов функции strtok() приводит к разбиению строки str на части (лексемы) .
5. И, наконец, пример:
#include <stdio.h> // printf()
#include <string.h> // strtok()
int main (void)
{
char str [24]="27.06.2013";
char sep [10]=".";
char *istr;
printf ("Ishodnaya stroka: %s
", str);
printf ("Result:
");
istr = strtok (str,sep);
while (istr != NULL)
{
printf ("%s
",istr);
istr = strtok (NULL,sep);
}
return 0;
}
6. Ну и если возникли дополнительные вопросы, вот ссылка (заметьте, по-русски) :
Удачи и до свидания!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>ra
> ...
Конечно, C и C++ очень сходны. Но всё же путать не стоит. Или Вы хотели Сан Саныча заменить, пока тот в отпуске? :-))
> Снизу пример, который должен быть понятен любому, знакомому с Си.
Пример на C++ не всегда понятен любому, знакомому с C. Как и пример на Delphi не всегда понятен любому, знакомому с Turbo Pascal.
А вот наоборот - да.

Ответ от И.А. Голованов[гуру]
думаю, судя по описанию внутри там примерно такое
(код примерный - состряпал на коленке. могут быть неполадки с индексами)
char *strstr(char *str, char*razd){
static char * nach;// для хранения указателя на хвост между вызовами
char *ret=NULL;
int i=0;
if(str)nach=str;//взять новую строку или использовать запомпенное
if(!nach)return NULL;
while( nach[ i] && strchr(razd,nach[ i]) )i++; //отрезать разделители вначале
if(!nach[ i]){nach=NULL; return ret;} // одни разделители
nach[ i-1]=0;nach+=i;ret=nach;i=0; //зафиксировать начало токена
while( nach[ i] && !strchr(razd,nach[ i]) )i++; //идти до разделителя
while( nach[ i] && strchr(razd,nach[ i]) ){nach[ i] =0;i++;} //заглушить разделители дальше до нового токена или конца строки
if(nach[ i])nach+=i; else nach=NULL; //запомнить начало остатка
return ret;
}
надеюсь поможет разобраться

Ответ от Ra[гуру]
ссылка
Снизу пример, который должен быть понятен любому, знакомому с Си.
Если первый параметр указатель, то strtok "начинает по новой". Если NULL, то продолжает со строкой, указанной в первом вызове. Второй параметр -- разделители. Каждый вызов возвращает указатель на очередную лексему (подстроку, которую ограничена разделителями) , или NULL, если строка полностью обработана.
strtok() "разрушает" обрабатываемую строку, если исходную строку нужно сохранить, то придется работать с копией строки.
Что конкретно непонятно?

Ответ от 3 ответа[гуру]
Привет! Вот подборка тем с похожими вопросами и ответами на Ваш вопрос: Вопрос по функции Си strtok. Никак не могу разобраться как она работает...
Strtok на Википедии
Посмотрите статью на википедии про Strtok
Абрамов Александр Викторович на Википедии
Посмотрите статью на википедии про Абрамов Александр Викторович
 

Ответить на вопрос:

Имя*

E-mail:*

Текст ответа:*
Проверочный код(введите 22):*