Главная страница
    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.052 c
15-1168018699
Loginov Dmitry
2007-01-05 20:38
2007.01.28
Поделки


6-1156604920
mr. Eof
2006-08-26 19:08
2007.01.28
Проблема с TidHTTP метод PUT


15-1168009247
Chort
2007-01-05 18:00
2007.01.28
Флешкa


15-1168276887
ZiTRaX
2007-01-08 20:21
2007.01.28
Какие авторы считаются лучшими???


15-1168496136
EvChul
2007-01-11 09:15
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский