Форум: "Начинающим";
Текущий архив: 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