HLFX.Ru Forum
Показать все 6 сообщений этой темы на одной странице

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Технические вопросы (https://hlfx.ru/forum/forumdisplay.php?forumid=20)
-- С++ Парсер строки (https://hlfx.ru/forum/showthread.php?threadid=1462)


Отправлено Scrama 31-07-2008 в 10:28:

Unhappy С++ Парсер строки

Что-то я запарился с этой штукой. Короче, нужна функция вот с таким прототипом:

C++ Source Code:
int ParseString(wchar_t * wcIn, wchar_t ** wcOut);
Т.е. подаем ей строчку в юникоде (а ля "словораз; словодва; словотри"), получаем массив юникодовых строчек и возвращаем количество строк. Писал так:
C++ Source Code:
1
int ParseString(CComBSTR Input, CComBSTR **Output)
2
{
3
  long l = sizeof Input;
4
  long i = 0, lC = 0;
5
  CComBSTR *buf;
6
 
7
  while (i <= l){
8
    CComBSTR tmp(L"");
9
    while (' ' == Input[i]) i++;
10
    while ((';' != Input[i])&&(i <= l)){
11
      tmp +=Input[i];
12
      i++;
13
    }
14
    if (lC){
15
      buf = *Output;
16
      *Output = new CComBSTR[lC+1];
17
      for(long k=0; k<lC; k++) *Output[k] = buf[k];
18
    }
19
    else{
20
      *Output = new CComBSTR[1];
21
    }
22
    *Output[lC] = tmp;
23
    lC++;
24
  }
25
  return lC;
26
}
Не работает.

Добавлено 31-07-2008 в 16:11:

ага, часть косяка нашел - long l = Input.Length();
раз уж все равно CComBSTR использую.

Добавлено 31-07-2008 в 17:15:

Делаю через wcstok, получиться - расскажу

Добавлено 31-07-2008 в 17:26:

C++ Source Code:
1
int ParseAlias(CComBSTR Input, CComBSTR **Output)
2
{
3
  const wchar_t	*d = L";";
4
  wchar_t *v, *nt;
5
  int lC = 0;
6
  CComBSTR *pBuf, *pTmp;
7
 
8
  v = wcstok_s(Input, d, &nt);
9
  while (v){
10
    if (lC){
11
      pBuf = pTmp;
12
      pTmp = new CComBSTR[lC+1];
13
      for (int i=0; i<lC; i++) pTmp[i] = pBuf[i];
14
    }
15
    else
16
      pTmp = new CComBSTR[1];
17
    pTmp[lC] = v;
18
    lC++;
19
    v = wcstok_s(NULL, d, &nt);
20
  }
21
  *Output = pTmp;
22
  return lC;
23
}


Добавлено 31-07-2008 в 17:28:

И почему себе в репу +10 поставить?
Пусть висит, ведь на самом деле фиг найдешь по гуглю, как правильно это делать, иначе я бы столько времени не потратил.

__________________
"Злобным гениям не нужна харизма." © Shooter__Andy
"Making stuff for an "old ugly game" can be ten times more fun than grinding on a map for a dull, next-gen title." © Lunaran


Отправлено Дядя Миша 31-07-2008 в 14:48:

Scrama а чем старый-добрый Com_ParseToken тебя не устроил?
Я на его основе написал целую parselib, правда на чистом с
но может кому пригодится.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Scrama 01-08-2008 в 01:53:

Видимо, я о нем не знал. Я ж дельфиец, а на цэпэпэ пишу только в минуты отчаяния

__________________
"Злобным гениям не нужна харизма." © Shooter__Andy
"Making stuff for an "old ugly game" can be ten times more fun than grinding on a map for a dull, next-gen title." © Lunaran


Отправлено Scrama 01-08-2008 в 06:08:

Тут же, ибо снова CComBSTR *

Короче, передаю в функцию этот самый набор строк. Как его лучше передать - как CComBSTR *pAlias или как CComBSTR pAlias[]?
Конкретно, мне нужно узнать количество строк, чтоб не таскать их из функции в цункцию от момента заполнения. sizeof всегда выдает мне 4, видимо, это размер указателя в байтах.

__________________
"Злобным гениям не нужна харизма." © Shooter__Andy
"Making stuff for an "old ugly game" can be ten times more fun than grinding on a map for a dull, next-gen title." © Lunaran


Отправлено Дядя Миша 01-09-2008 в 09:05:

Scrama длину строки strlen, а кол-во строк можно считать вручную по факту обнаружения '\n'
Хотя я полагаю, что CComBSTR это и сам умеет.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Scrama 01-09-2008 в 09:40:

Я уж и забыл про этот тред! Я тогда при формировании списка последним элементом какой-то значок добавлял и обрабатывал потом до его первого вхождения, решил в лоб.

__________________
"Злобным гениям не нужна харизма." © Shooter__Andy
"Making stuff for an "old ugly game" can be ten times more fun than grinding on a map for a dull, next-gen title." © Lunaran


Временная зона GMT. Текущее время 19:46.
Показать все 6 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024