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;
}
надеюсь поможет разобраться
ссылка
Снизу пример, который должен быть понятен любому, знакомому с Си.
Если первый параметр указатель, то strtok "начинает по новой". Если NULL, то продолжает со строкой, указанной в первом вызове. Второй параметр -- разделители. Каждый вызов возвращает указатель на очередную лексему (подстроку, которую ограничена разделителями) , или NULL, если строка полностью обработана.
strtok() "разрушает" обрабатываемую строку, если исходную строку нужно сохранить, то придется работать с копией строки.
Что конкретно непонятно?