Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Аналог strtok  (Прочитано 5124 раз)
0 Пользователей и 1 Гость смотрят эту тему.
DaSharm
Гость
« : 25-02-2005 20:12 » 


мне нужно написать аналог strtok (в конкретном примере нет возможности использования strtok). Т. е. нужно написать свою ф-цию, что полностью заменяет strtok. Я написал что-то, но сам не понимаю где глюк. Ф-ция типа работает, но страшно глючит...Помогите пожалуйста...

мой пример:

char *valtok;
DWORD iv;

char *mstrtok(char *tok, DWORD ltok,char *delim)
{
char *mresult;
DWORD f;

if(!lstrcmp(tok,NULL)){
}
else
{
valtok=(char*)GlobalAlloc(0,ltok+1);
lstrcpyn(valtok,tok,ltok+1);
}


for(DWORD i=iv;i<ltok;i++)
{

if(valtok[i]==delim[0]){

mresult=(char*)GlobalAlloc(0,i-iv);

for(f=0;f<i;f++)
{
mresult[f]=valtok[iv+f];
}
     mresult[i-iv]=0x00;

iv+=(i+1);
return mresult;
}



}



return valtok;
}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
char a[]="1aagf|2abcabc|3ee|aaa";
char b='|';
MessageBox(0,mstrtok((char*)&a,strlen((char*)&a),(char*)&b),NULL,0);
MessageBox(0,mstrtok(NULL,strlen((char*)&a),(char*)&b),NULL,0);
MessageBox(0,mstrtok(NULL,strlen((char*)&a),(char*)&b),NULL,0);
return 0;
}
« Последнее редактирование: 03-12-2007 18:09 от Алексей1153++ » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 25-02-2005 20:40 » 

Ошибка первая:
Цитата
Код:
   if(!lstrcmp(tok,NULL)){
Правильно так:
Код:
  if(tok!=NULL) {

Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 25-02-2005 20:44 » 

Может проще взять готовое?
Вот первое, что попалось под руку (из ядра linux):
Код:
/**
 * strpbrk - Find the first occurrence of a set of characters
 * @cs: The string to be searched
 * @ct: The characters to search for
 */
char * strpbrk(const char * cs,const char * ct)
{
        const char *sc1,*sc2;

        for( sc1 = cs; *sc1 != '\0'; ++sc1) {
                for( sc2 = ct; *sc2 != '\0'; ++sc2) {
                        if (*sc1 == *sc2)
                                return (char *) sc1;
                }
        }
        return NULL;
}

/**
 * strsep - Split a string into tokens
 * @s: The string to be searched
 * @ct: The characters to search for
 *
 * strsep() updates @s to point after the token, ready for the next call.
 *
 * It returns empty tokens, too, behaving exactly like the libc function
 * of that name. In fact, it was stolen from glibc2 and de-fancy-fied.
 * Same semantics, slimmer shape. ;)
 */
char * strsep(char **s, const char *ct)
{
        char *sbegin = *s, *end;

        if (sbegin == NULL)
                return NULL;

        end = strpbrk(sbegin, ct);
        if (end)
                *end++ = '\0';
        *s = end;

        return sbegin;
}
Вызывать надо strsep().
« Последнее редактирование: 03-12-2007 18:10 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines