Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Опять работа со строками [D7, XP]


Dyakon_Frost ©   (2007-01-08 19:27:00) 

Здравствуйте!

Пишу консольное приложение.
Есть стринговая переменная SText, в которой хранится текст на англ. языке.
Есть две стринговые переменные Fstr, Sstr.
Нужно найти эти слова в тексте и выделить их цветом, все это вывести на экран! После чего поменять их местами в тексте и вывести весь текст с уже сделанной заменой!

Я конечно могу привести текст кода, но он на С++. Мне неудалось найти ответа на форумах по С++, поэтому я обращаюсь сюда! Перевести потом код Делфи в С++ не так и сложно.

Но может поможет:

i = CText.Pos(Fstr);
i0 = 1;
while(i)
{
 CText.Delete(i,Fstr.Length());
 getch();
 Color();
 CText.Insert(Sstr,i);
 getch();
 i0 = i + Sstr.Length();
 i = i0 - 1 + CText.SubString(i0,255).Pos(Fstr);
}

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

Заранее благодарен.


Dyakon_Frost   (2007-01-10 05:17:00) [1]

Большое спасибо! Поюзал CompareMem - понравилось! ))


ors_archangel   (2007-01-08 21:43:00) [2]


> ors_archangel ©   (08.01.07 21:41) [1]

Write(a) или Write(b) нужно ещё выбирать :(


ors_archangel   (2007-01-08 21:41:00) [3]

Пусть s - текст, a и b - подстроки для выделения и замены.
1.
Делаем цикл по строке:
for i := 1 to length(s)-max(length(a,b)) do begin
В цикле проверяем, не наткнулись ли мы на одну из подстрок:
 if CompareMem(@s[i],@a[1],length(a)) or CompareMem(@s[i],@b[1],length(b)) then begin
Наёдена одна из подстрок, нужно выделить цветом, наверно на WinAPI это можно сделать так:
   SetConsoleTextAttribute(stdoutput, BACKGROUND_BLUE or BACKGROUND_GREEN or BACKGROUND_RED);  
Дальше выводим подстроку:
   Write(a);
Восстанавливаем цвет:
   SetConsoleTextAttribute(stdoutput, FOREGROUND_BLUE or FOREGROUND_GREEN or FOREGROUND_RED);  
 end else
Иначе выводим только один символ (ужас):
   Write(s[i]);
end;
2.
Самый тупой (просто зверский) способ поменять в строке две подстроки, при условии, что в s нет символов с кодами 1 и 2:

 s := StringReplace(s, a, #1);
 s := StringReplace(s, b, #2);
 s := StringReplace(s, #1, b);
 s := StringReplace(s, #2, a);

Лучше, конечно, сделать хотя бы примерно так:

i := 1;
while i < length(s)-max(length(a),length(b)) do begin
  if CompareMem(s[i], a[1], length(a)) then begin
    Delete(s, i, length(a));
    Insert(b, s, i);
    i := i + length(b);
  end else if CompareMem(s[i], b[1], length(b)) then begin
    Delete(s, i, length(b));
    Insert(a, s, i);
    i := i + length(a);
  end else
    inc(i);
end;

Но неизвестно, что будет хуже работать :( Есть, естественно, гораздо более рациональные решения


Наверх

Титульная страница Поиск, карта сайта Написать письмо