Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Разбить AnsiString


Автор: szz 15.11.2005, 23:16
Есть ли аналог для АнсиСтринга функции explode() в PHP или str.split() в ActionScript?

Автор: _hunter 16.11.2005, 11:37
есть

Автор: Vyacheslav 16.11.2005, 11:40
Для того, чтобы ответить на вопрос, я должен знать PHP или ActionScript. Вы считаете, что они должны входить в обязательное базовое образование программиста на С++?

Автор: Neitron 16.11.2005, 11:55
Vyacheslav
Нет мы не считаем, поэтому пусть на этот вопрос ответит я.


szz
Нету аналога.
Его ты должен написать сам, используя
ф-ции члены ансистринга AnsiPos и s.SubString
Также предлагаю попробовать воспользоваться StringList
У него есть свойсва DelimitedText и Delimiter.


Автор: szz 16.11.2005, 12:18
Цитата(_hunter)
есть

О спасибо за информативный ответ! Я поискал по хелпу ничего не нашел.
Цитата(Vyacheslav @ 16.11.2005, 11:40)
Вы считаете, что они должны входить в  обязательное базовое образование программиста на С++?

Разумеется нет. ОК, я поясню.
Нужна такая функция, которая разделяет строку на подстроки в массив строк, используя разделитель:
Код

AnsiString text = "blabla-=-bebe-=-ogogo-=-ugugu";
AnsiString splitter = "-=-";
AnsiString *result = new AnsiString[getExplodeLength(text, splitter)];// getExplodeLength должна вернуть int, на сколько строк разделиться наша text c помощью splitter, в данном случае она вернет 4
Explode(text, splitter, result);
// вот теперь в result должны находиться 
printf("%s\n%s\n%s\n%s\n", result[0].c_str(), result[1].c_str(), result[2].c_str()б result[3].c_str());
// должно напечатать 
======================
blabla
bebe
ogogo
ugugu
======================

так вот, нужны как раз эти две функции getExplodeLength и Explode
Добавлено @ 12:23
Neitron, я все понял.
Очень странно, ведь ситуация довольно распространенная и порой весьма удобно делать именно так (или может я просто разбаловался высокоуровневыми языками smile ). Странно что ее не продумали. Должна быть где-то в сети такая функция...
Если найду - выложу. не найду - напишу и выложу.

Автор: _hunter 16.11.2005, 12:56
Цитата
О спасибо за информативный ответ! Я поискал по хелпу ничего не нашел.

пожалуйста. ( какой вопрос -- такой и ответ )

P.S.
что делать Neitron уже ответил

Автор: Alca 1.7.2007, 21:36
Код

//---------------------------------------------------------------------------
void __fastcall TfrmMain::Button1Click(TObject *Sender) {
    ShowMessage(Split("000|111|222|333|444", '|', 2));

}
//---------------------------------------------------------------------------
AnsiString __fastcall TfrmMain::Split(const AnsiString & asStr, char cDelimiter, unsigned int iIndex) {
    TStringList* pList = new TStringList(); 
    pList->Delimiter        = cDelimiter;
    pList->DelimitedText = asStr;

    //проверка iIndex
    if ((iIndex < (unsigned)0) || (iIndex >= (unsigned)pList->Count)) {
        return "";
    }

    return pList->Strings[iIndex];
}
//---------------------------------------------------------------------------


Может кому згадится

Автор: Romikgy 1.7.2007, 22:10
Цитата(Alca @  1.7.2007,  20:36 Найти цитируемый пост)
Может кому згадится 

гы ... через жва то года smile

Автор: mr.Anderson 2.7.2007, 10:54
[offtop] smile smile smile [/offtop]

Автор: JackYF 2.7.2007, 11:29
+1 к количеству некрофилов, гы. smile что-то в последнее время много развелось smile

Автор: szz 2.7.2007, 11:53
Ага smile

Тем более что ответ неверный - у Alca разделитель - одна буква, что сделать элементарно.

Я же просил случай с разделителем строкой произвольной длины, что уже посложнее.

Эх, я сделал это прям те  самые два года назад, проект давно свое отслужил и забыт smile

Выложить как и обещал? 

Ток еще надо найти на пыльных полках  smile 

Автор: Alca 2.7.2007, 19:23
Выкладывай

Автор: Romikgy 2.7.2007, 19:27
Цитата(szz @  2.7.2007,  10:53 Найти цитируемый пост)
Я же просил случай с разделителем строкой произвольной длины, что уже посложнее.

через stringlist + replacestring ничего сложного smile

Автор: szz 2.7.2007, 21:28
Alca, выложил, http://forum.vingrad.ru/sources/topic-161759.html smile


Romikgy, канешно smile 2 года назад ты это знал, признавайся честно?  smile 

Автор: Romikgy 2.7.2007, 22:06
Цитата(szz @  2.7.2007,  20:28 Найти цитируемый пост)
2 года назад ты это знал, признавайся честно?

не помню уже smile возможно да возможно нет  smile 

Автор: szz 2.7.2007, 23:29
знал бы - ответил бы 2 года назад )))  так что  smile 

Автор: Klin 3.7.2007, 11:29
Цитата(szz @  3.7.2007,  00:29 Найти цитируемый пост)
знал бы - ответил бы 2 года назад )))  так что 

Главное, чтобы сейчас знал smile

Автор: Romikgy 3.7.2007, 22:51
Цитата(szz @  2.7.2007,  22:29 Найти цитируемый пост)
знал бы - ответил бы 2 года назад )))  так что

2 года назад я и С++ не знал  smile  если бы на дельфи такой вопрос был задан , думаю что и тогда ответ был бы получен , аналогичный моему сейчас  smile 

Автор: bronenos 5.7.2007, 08:46
вот моя, правда она странно делает - если вызвать ShowMessage элемента перед return - выдает правильно, а если ShowMessage результата, который функция вернула - то пусто... может кто-нить скажет где ошибка заодно...
Код

AnsiString* Split(AnsiString input, AnsiString sep)
{
  AnsiString output[250] /* ну 250 - это для моих нужд */;
  int pos=1, size=0;

  while(true)
  {
    pos = input.AnsiPos(sep);

    if (pos == 0)
    {
      output[size] = input;
      break;
    }
    else
      output[size++] = input.SubString(0, pos-1);

    input.Delete(1, pos+sep.Length()-1);
    if (pos == 0) break;
  }

  return output;
}

Автор: JackYF 5.7.2007, 09:05
Цитата(bronenos @  5.7.2007,  08:46 Найти цитируемый пост)
функция вернула - то пусто... может кто-нить скажет где ошибка заодно...

ну дык... после выхода из функции локальный массив уничтожается. Либо создавай его динамически, либо (это лучше) возвращай std::vector<AnsiString>.

Автор: bronenos 5.7.2007, 09:15
а почему тогда в случае, если это массив числовой, то все работает?

Автор: HappyLife 5.7.2007, 09:49
bronenos, 
Потому что это неопределенность. Как компилятор захочет так и сделает.

Автор: bronenos 5.7.2007, 09:55
о пасиба)) заработало...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)