C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
замена слов в строке
iru
  Отправлено: 01.05.2004, 20:56


Не зарегистрирован







ни могу сделать следующее:

надо найти слова ограниченные символами "<>" в строке.
таких слов может быть N-ое колличество.
заменить их на другие слова и поставить в эту же строку на их место.

Например:
" товарищь <пупкин>, является на самом деле не <пупкин>.
он был <пупкин> , но очень давно."

Надо заменить "Пупкин" на "Иванов" без ковычек и знаков "<>"
т.е. предложение после обработки должно выглядить так:

"товаришь Иванов, является на самом деле не Иванов, он был Иванов,
но очень давно."

помогите, плз.
gauldot
Отправлено: 01.05.2004, 21:49


Ученик-кочегар

Группа: Участник
Сообщений: 22



Ну если в угловатых скобках надо заменять одно и тоже слово, то можно воспользоваться функцией:
CODE

#include <StrUtils.hpp>
AnsiString AnsiReplaceText (AnsiString Gde, AnsiString Chto, AnsiString NaChto);
exp
Отправлено: 01.05.2004, 23:20


Мастер участка

Группа: Участник
Сообщений: 304



Вот код.
CODE

int StartIndex = 1, EndIndex = 1;
AnsiString InputStr = Edit1->Text; // Здесь будем менять
AnsiString SubStr = Edit3->Text;   // на это
while(!false==true)                // бесконечный цикл. Нужен для многократной замены
{
int i;
for(i=1; i<=InputStr.Length();i++)  // будем искать по всей строке "<"
       {
         if(InputStr[i]=='<')      // как только нашли — будем искать ">"
         {
           StartIndex = i;         // запоминаем индекс символа "<"
           bool EndFound = false;  // отмечаем, что конец слова еще не найден
           for(int j = StartIndex; j<=InputStr.Length();j++) // и ищем его
           {
            if(InputStr[j]=='>')   // нашли
            {
             EndFound = true;      // отмечаем, что конец найден
             EndIndex = j;         // запоминаем индекс символа ">"
            }
            if(EndFound)           // и если конец найден
            {                      // (а ведь его может и не быть)
             InputStr.Delete(StartIndex,(EndIndex-StartIndex+1));// вырезаем найденый кусок
             InputStr.Insert(SubStr, StartIndex); // и вставляем строк-заменитель
             break; // выходим из цикла
            }
           }
         }
       }
if(i>InputStr.Length()) break; // если мы досмотрели всю строку до конка, то выходим
}
Edit2->Text = InputStr;

Если теперь в Edit1->Text ввести :
товарищь <пупкин>, является на самом деле не <пупкин>.он был <пупкин> , но очень давно.
А в Edit3->Text:
Иванов
То в Edit2->Text получится:
товарищь Иванов, является на самом деле не Иванов.он был Иванов , но очень давно.
Вроде все.
Георгий
Отправлено: 01.05.2004, 23:58


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



QUOTE
while(!false==true)

круто!!
а
CODE
while(true)

или
CODE
for(;;)

писать не модно?

причём последнее официально вечный цикл
exp
Отправлено: 02.05.2004, 23:43


Мастер участка

Группа: Участник
Сообщений: 304



да прикол это просто.
а можно и так извратиться
CODE

while((2*2)==4)

или
CODE

bool x = true; //впрочем, пофиг, что вы им присвоите
bool y = false;//--|
bool z = false //--|
while(!(!x||(!y||z))||(!(!x||y)||(!x||z)))
{
...
}

Выражение в скобках тавталогия (тождественно true)[U]

Отредактировано exp — 03/05/2004, 00:47
Doga
Отправлено: 03.05.2004, 19:27


Мастер участка

Группа: Участник
Сообщений: 575



Мдя...

А про

extern PACKAGE AnsiString __fastcall StringReplace(const AnsiString S, const AnsiString OldPattern, const AnsiString NewPattern, TReplaceFlags Flags);

все забыли чтоль? Она сама без циклов может всё чо надо заменить...
iru
Отправлено: 04.05.2004, 17:49


Не зарегистрирован







спасибо, всем ответившим, особенно EXP.

ибо гибко, кое-что для себя поправлю и то что надо!
так как слова в <> ,будут использоваться в качестве параметров
для других функций.

ещё раз всем ограменное спасибо.
кстати, узнал о новых функциях smile.gif
Gedeon
Отправлено: 05.05.2004, 09:25


Ветеран

Группа: Модератор
Сообщений: 1742



QUOTE

while(!false==true)

Да — это СУПЕР! biggrin.gif biggrin.gif biggrin.gif
olegenty
Отправлено: 05.05.2004, 09:41


Ветеран

Группа: Модератор
Сообщений: 2412



меня
CODE

while(!false==true)

смущает с точки зрения лишних нажатий на клавиши. самая короткая запись, не менее понятная:
CODE

while(1)

в любом учебнике же написано, что false это 0, а true — это не ноль.

ну, в крайнем случае
CODE

while(true)

но оператор сравнения там зачем, всё равно не доходит...
Георгий
Отправлено: 05.05.2004, 11:19


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



QUOTE
смущает с точки зрения лишних нажатий на клавиши
CODE
for(;;)
всего 7 символов, в то время, как
CODE
while(1)
целых 8!

Вернуться в Вопросы программирования в C++Builder