Главная страница
    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
15-1167926050
kaZaNoVa
2007-01-04 18:54
2007.01.28
Психология и интернет, реальность и виртуальность.


2-1168524462
inkvizitor
2007-01-11 17:07
2007.01.28
!опять мемо:-(!


2-1168209961
kingsoft
2007-01-08 01:46
2007.01.28
Время простоя программы


2-1168436770
FIL-23
2007-01-10 16:46
2007.01.28
работа с константой


2-1168426545
Kcor
2007-01-10 13:55
2007.01.28
DateTimePicker





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