функция strtok

Тема в разделе "LANGS.C", создана пользователем perdimonokl, 23 дек 2007.

  1. perdimonokl

    perdimonokl New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2007
    Сообщения:
    38
    Народ может есть у кого переписанный на С++ аналог функции strtok или wcstok.Написать сам не смог :dntknw:

    Чтобы было ясно о чём речь привожу аналог функции strstr
    Код (Text):
    1. LPSTR WINAPI fstrstr(LPSTR str1,LPSTR str2,INT size1, INT size2)
    2.    {
    3.      LPSTR result = NULL;
    4.      if(size2 > size1) return result;
    5.      for(INT i = 0; i < size1; i++)
    6.      {
    7.         if(str1[i] == str2[0])
    8.         {
    9.            for(INT j = 0; j < size2; j++)
    10.            {
    11.               if(str1[i+j] == str2[j])
    12.               {
    13.                 result = (LPSTR)(str1+i);
    14.               }
    15.               else result = NULL;
    16.            }
    17.            if(result != NULL)
    18.            {
    19.              return result;
    20.            }
    21.         }
    22.      }
    23.      return result;
    24.    }
    Или может подкинет кто функцию которая разобьёт строку по заданному символу и запишет в массив как например функция explode() в php
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    а че тут писать то... strchr на этот символ и потом malloc + strncpy
    и так в цикле
     
  3. perdimonokl

    perdimonokl New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2007
    Сообщения:
    38
    Да чёт не получается у меня :dntknw: Я просто хотел пропарсить файлик и забит он строками разного размера то есть так примерно

    Код (Text):
    1. aaa:bbbb:ccc
    2. AAAAA:DDD:CCCCC
    3. CCCCCCCC:AAA:vvvv
    4. xxx:asd:CCC
    И нужно мне было взять сроку из файла и вывести середину то есть из первой строки это bbbb из второй DDD и всё это не используя strtok() даже не спрашивайте почему. Плохо я умею работать со сроками, если не сложно то реализуйте и помогите кодом а не советом :)
     
  4. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    perdimonokl
    Great уже подсказал - используй функцию strchr.
    К примеру так:
    char* beg = strchr(line, ':');
    char* end = strchr(beg + 1, ':');
    *end = 0;
    strcpy(Buffer, beg + 1);

    Это без обработки всяких нехороших ситуаций (beg != NULL, end != NULL). Исходная строка line тоже портится, чтобы не портилась, нужно восстанавливать байт по адресу end.
     
  5. roman_pro

    roman_pro New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    291
    Самописный аналог strtok_s (потокобезопасный вариант strtok, подробности в MSDN):

    Код (Text):
    1. char * __cdecl strtk_s(char *String, const char *Control, char **Context)
    2. {
    3.     char *token;
    4.     const char *ctl;
    5.     if (!String)
    6.     {
    7.         String = *Context;
    8.     }
    9.     for ( ; *String != 0 ; String++)
    10.     {
    11.         for (ctl = Control; *ctl != 0 && *ctl != *String; ctl++)
    12.             ;
    13.         if (*ctl == 0)
    14.         {
    15.             break;
    16.         }
    17.     }
    18.     token = String;
    19.     for ( ; *String != 0 ; String++)
    20.     {
    21.         for (ctl = Control; *ctl != 0 && *ctl != *String; ctl++)
    22.             ;
    23.         if (*ctl != 0)
    24.         {
    25.             *String++ = 0;
    26.             break;
    27.         }
    28.     }
    29.     *Context = String;
    30.       if (token == String)
    31.     {
    32.         return NULL;
    33.     }
    34.     else
    35.     {
    36.         return token;
    37.     }
    38. }
     
  6. perdimonokl

    perdimonokl New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2007
    Сообщения:
    38
    Огромнейшее спасибо тебе roman_pro

    Функция работает как часы :)