Типы данных в языке C++________________________________677

В этом коде использован ряд элементов-функций класса AnsiString: Pos, Sub-
string, Length. Обратите внимание на то, что доступ к ним осуществляется опера-
цией точка (.), вместо более привычной в C++Builder операции доступа к методам
компонентов стрелка (->). Дело в том, что к методам компонентов доступ осущест-
вляется через указатель на объект, а в данном случае к методам AnsiString доступ
осуществляется через сами объекты — строки.

Первый выполняемый оператор приведенного кода использует функцию Pos.
Эта функция ищет в строке, к которой она применена (в нашем случае в S1), пер-
вое вхождение подстроки, заданной ее параметром (в нашем случае S2). Если по-
иск успешный, функция возвращает индекс первого символа найденного вхожде-
ния подстроки. Индексы начинаются с 1. Если подстрока не найдена, возвращает-
ся 0.

Следующий оператор с помощью структуры if...else проверяет, не равно ли
нулю (false) возвращенное функцией Pos значение. Если не равно, то производит-
ся формирование строки с заменой найденной подстроки. Строка формируется
склеиванием трех строк: начальной части строки S1, расположенной до найденно-
го вхождения подстроки, строки S3, заменяющей найденное вхождение, и заклю-
чительной части строки S1, расположенной после найденного вхождения. Для по-
лучения фрагментов строки S1 использована функция Substring. Эта функция
возвращает подстроку, начинающуюся с символа в позиции, заданной первым па-
раметром функции, и содержащую число символов, не превышающее значение.
заданное вторым параметром функции. Таким образом, выражение Sl.SubSt-
ring(l, i — 1) возвращает подстроку строки S1, начинающуюся с первого символа
и содержащую i — 1 символов, т.е. часть строки S1, расположенную до найденно-
го вхождения подстроки S2. Аналогично, выражение Sl.SubString(i +
S2.Length(), 255) возвращает подстроку строки S1, расположенную после найден-
ного вхождения подстроки S2. При этом для определения начала этой подстроки
использована функция Length, возвращающая число символов в строке (в нашем
случае — в строке S2, содержащей заменяемый фрагмент). В приведенном выра-
жении в качестве второго параметра функции Substring задано число 255, кото-
рое, как ожидается, превышает длину подстроки. В действительности будет воз-
вращено менее 255 символов, столько, сколько имеется до завершающего S1 нуле-
вого символа.

Сравнение данного кода с приведенным в предыдущем разделе для типов
строк (char *), как мне кажется, показывает большую прозрачность действий со
строками AnsiString.

Если нам надо не отображать измененную строку в виде сообщения, а просто
произвести замену фрагмента в исходной строке S1, это еще более упрощает код,
который в этом случае сводится всего к двум операторам:

int i = S1.Pos (S2) ;

S1 = S1.Substring(1,i-1) + S3 + S1.Substring(i+S2.Length(),255);

Подобная задача для строк (char *) была бы более сложной и потребовала бы
объявления дополнительного буфера для временного хранения формируемой стро-
ки.

Давайте еще более усложним задачу: пусть в строке S1 надо заменить все
вхождения S2 на строку S3. Эту задачу можно было бы решить следующим кодом:

int i0 = 0, i = Sl.Pos(S2);

while(i)
{

S1 = S1.Substring(1,i + i0 - 1) + S3 + S1.Substring(i + i0 +

S2.Length(),255) ;

i0 += i - 1 + S3.Length();

i = S1.Substring(i0 + 1, 255).Pos (S2);

)