Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление лишних пробелов в строке, внутри строки 
:(
    Опции темы
s_a_s_h_a
Дата 28.4.2006, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 261
Регистрация: 20.7.2004
Где: Петрозаводск

Репутация: 1
Всего: 1



Есть какая-нибудь стандартная функция для удаления лишних пробелов внутри строки?

А может быть есть какая-нибудь либа, которая бы реализовывала хотя бы некоторые возможности, которые есть в Перле или ПХП при работе со строками? В частности, что-то подобное регулярным выражениям. 
PM MAIL   Вверх
_hunter
Дата 28.4.2006, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



Удалять можно что самому что AnsiReplaceStr/AnsiReplaceText что StringReplace
регулярные выражения есть в TRegExp 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
sexton
Дата 28.4.2006, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sexton=Пономарь (eng)
**


Профиль
Группа: Участник
Сообщений: 503
Регистрация: 5.5.2004
Где: Ульяновск

Репутация: 5
Всего: 9



Как вариант
Код

    while (Text.Pos("  ")!=0)
    {
      Text = AnsiReplaceText(Text, " ", "");
    }
 
PM MAIL WWW ICQ   Вверх
s_a_s_h_a
Дата 28.4.2006, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 261
Регистрация: 20.7.2004
Где: Петрозаводск

Репутация: 1
Всего: 1



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

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

так, я думаю, все пробелы будут удалены, а не только лишние. Лишние - это те, что после первого пробела после каждого слова. 
PM MAIL   Вверх
_hunter
Дата 28.4.2006, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



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


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Sanek123
Дата 4.5.2009, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 22.10.2008

Репутация: нет
Всего: нет



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

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;

Может можно как-нибудь упростить? Ну, хотя бы в одну строчку, чтоли.  Надо чтоб из текста остались только слова разделенные одним пробелом.
--------------------
Вас разыскивают бойцы 139-го порта...
PM MAIL   Вверх
A5uKa
Дата 4.5.2009, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


TЋ♥s F1rȜ iƧ BurȠiƞg
***


Профиль
Группа: Awaiting Authorisation
Сообщений: 1928
Регистрация: 30.8.2008

Репутация: 2
Всего: 16



del

Это сообщение отредактировал(а) A5uKa - 4.5.2009, 10:39
PM   Вверх
Alca
Дата 4.5.2009, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



Код

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;    
}



--------------------
PM WWW ICQ Skype Jabber   Вверх
Лапоть
Дата 4.5.2009, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 3.4.2009

Репутация: 1
Всего: 2



Код

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

PM MAIL   Вверх
artsb
Дата 4.5.2009, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Лапоть, ваш код себя не адекватно ведёт, если поставить много пробелов подряд.

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

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



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Лапоть
Дата 4.5.2009, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 3.4.2009

Репутация: 1
Всего: 2



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

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

Это сообщение отредактировал(а) Лапоть - 4.5.2009, 19:33
PM MAIL   Вверх
artsb
Дата 4.5.2009, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



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

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

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


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Лапоть
Дата 4.5.2009, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 3.4.2009

Репутация: 1
Всего: 2



Бывает! Не расстраивайся! smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0559 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.