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


Автор: s_a_s_h_a 28.4.2006, 10:48
Есть какая-нибудь стандартная функция для удаления лишних пробелов внутри строки?

А может быть есть какая-нибудь либа, которая бы реализовывала хотя бы некоторые возможности, которые есть в Перле или ПХП при работе со строками? В частности, что-то подобное регулярным выражениям. 

Автор: _hunter 28.4.2006, 11:17
Удалять можно что самому что AnsiReplaceStr/AnsiReplaceText что StringReplace
регулярные выражения есть в TRegExp 

Автор: sexton 28.4.2006, 11:20
Как вариант
Код

    while (Text.Pos("  ")!=0)
    {
      Text = AnsiReplaceText(Text, " ", "");
    }
 

Автор: s_a_s_h_a 28.4.2006, 11:49
Цитата(sexton @ 28.4.2006,  11:20)
Как вариант
Код

    while (Text.Pos("  ")!=0)
    {
      Text = AnsiReplaceText(Text, " ", "");
    }

так, я думаю, все пробелы будут удалены, а не только лишние. Лишние - это те, что после первого пробела после каждого слова. 

Автор: _hunter 28.4.2006, 11:57
значит AnsiReplaceText(Text, "  ", " ");
а, вообще, это самому проще сделать...
потому как лишние это еще и перед всякими запятыми и т.д. ... 

Автор: Sanek123 4.5.2009, 10:11
Я вот тут что-то начал городить циклы, но их слишком много!  
Код

S=Memo1->Lines->Text;



len=S.Length();
for (i=1;i<len-3;i++)
{
  if (S[i]==',' || S[i]=='.')
  {
  S=S.Delete(i,1);
  }
}

len=S.Length();
for (i=1;i<len-1;i++)
{
  if (S[i]==' ' && S[i+1]==' ')
  {
  S=S.Delete(i,1);
  }
}


len=S.Length();
for (i=1;i<len-1;i++)
{
  if (S[i]=='!' || S[i]=='?')
  {
  S=S.Delete(i,1);
  }
}

len=S.Length();
for (i=1;i<len-1;i++)
{
  if (S[i]=='-' || S[i]==':')
  {
  S=S.Delete(i,1);
  }
}

len=S.Length();
for (i=1;i<len-1;i++)
{
  if (S[i]=='"' || S[i]==char(39))
  {
  S=S.Delete(i,1);
  }
}

len=S.Length();
for (i=1;i<len-1;i++)
{
  if (S[i]=='#10' || S[i]=='#13')
  {
  S=S.Delete(i,1);
  }
}

S=AnsiLowerCase(S);

Memo1->Lines->Text=S;

Может можно как-нибудь упростить? Ну, хотя бы в одну строчку, чтоли.  Надо чтоб из текста остались только слова разделенные одним пробелом.

Автор: A5uKa 4.5.2009, 10:39
del

Автор: Alca 4.5.2009, 10:58
Код

std::string sTrimChar(const std::string &csStr, CHAR cChar) {
    std::string sRes("");
    sRes.assign(csStr);

    while ((!sRes.empty()) && (cChar == *sRes.begin())) {
        sRes.erase(sRes.begin());
    }

    while ((!sRes.empty()) && (cChar == *sRes.rbegin())) {
        sRes.erase(sRes.end() - 1);
    }
    
    return sRes;    
}

Автор: Лапоть 4.5.2009, 15:14
Код

  String res = "";
  char *p = strtok(Text.c_str(), " ");   // Text - это твоя строка (String/AnsiString)
  while (p) {
    res = res + String(p) + " ";
    p = strtok(NULL, " ");
  }
  // последний добавленный пробел не нужен, не забудь его удалить

Автор: artsb 4.5.2009, 18:01
Лапоть, ваш код себя не адекватно ведёт, если поставить много пробелов подряд.

s_a_s_h_a, как вариант:
Код

AnsiString st = Edit1->Text;
for(; st.Pos("  "); st = AnsiReplaceText(st, "  ", " "));
Label1->Caption = st;

Автор: Лапоть 4.5.2009, 19:32
artsb, А проверить слабо?  smile 
Брось на форму два едита и батон, вот код
Код

void __fastcall TForm1::Button1Click(TObject *Sender) {
  char *buf = new char[Edit1->Text.Length() + 1];
  strcpy(buf, Edit1->Text.c_str());
  String res = "";
  char *p = strtok(buf, " ");
  while (p) {
    res = res + String(p) + " ";
    p = strtok(NULL, " ");
  }
  Edit2->Text = res;
  delete [] buf;

Вот результат:
user posted image

Я этим пользуюсь не один год. Пока проколов не было...

Автор: artsb 4.5.2009, 19:45
Лапоть, сори. Виноват.
Я просто пробовал так:
Код

char *p = strtok(Edit1->Text.c_str(), " ");

Естественно, последующие вызовы strtok были не корректными. Вот я и получал кашу.

Автор: Лапоть 4.5.2009, 19:56
Бывает! Не расстраивайся! smile 

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