Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.043 c
2-1168300235
melnikov
2007-01-09 02:50
2007.01.28
TextOut и кисть bsClear, как вывести текст без фона?


8-1149167642
Morgan128
2006-06-01 17:14
2007.01.28
Совершенно сумасшедший вопрос


2-1168251367
Patrick
2007-01-08 13:16
2007.01.28
Проблема округления


3-1162996402
pic509
2006-11-08 17:33
2007.01.28
как убрать пароль с базы данных ib5?


2-1168195004
Ламер 2.Х
2007-01-07 21:36
2007.01.28
Посылаем файл!!!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский