Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.28;
Скачать: CL | DM;

Вниз

Опять работа со строками   Найти похожие ветки 

 
Dyakon_Frost ©   (2007-01-08 19:27) [0]

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

Пишу консольное приложение.
Есть стринговая переменная 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);
}

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

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


 
ors_archangel ©   (2007-01-08 21:41) [1]

Пусть 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;

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


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


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

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


 
Dyakon_Frost ©   (2007-01-10 05:17) [3]

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



Страницы: 1 вся ветка

Текущий архив: 2007.01.28;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.058 c
2-1168422395
Juice
2007-01-10 12:46
2007.01.28
Вопрос по DisplayFormat


15-1166074217
Gydvin
2006-12-14 08:30
2007.01.28
А был ли "сглаз"


15-1166237552
for
2006-12-16 05:52
2007.01.28
Сишные циклы FOR в Паскаль не переводятся?


2-1168325787
DelphiLexx
2007-01-09 09:56
2007.01.28
Быстрое заполнение дин. массива


2-1168699117
IvanIvan
2007-01-13 17:38
2007.01.28
DbGrid