674_____________________________________________Глава 12

Обратите внимание на то, что размер первой строки выбран с запасом, чтобы в
ней уместились оба текста. Если не задать в объявлении размер строки, то он опре-
делится по присваиваемому ей тексту и в ней не останется места для каких-то до-
бавлений.

Функция strcat прибавляет к тексту строки, указанной ее первым парамет-
ром, текст строки, указанной вторым параметром, и возвращает указатель на пер-
вую строку. Последнее обстоятельство позволяет делать вложенные вызовы strcat,
если надо склеить несколько текстов. Давайте несколько усложним задачу. Пусть
мы хотим оставить в неприкосновенности обе строки, а в третьей строке S хотим
получить склеенные тексты строк S1 и S2, разделенные символом пробела. Это
можно сделать следующими операторами:

char *S1 = "текст I", *S2 = "текст 2", S[20];

strcat(strcat(strcat (S,S1)," "),S2);

Самый внутренний вызов strcat склеивает пустую строку S и строку S1. Он
возвращает указатель на S и, значит, следующий вызов strcat склеивает текст, по-
явившийся в S, со строковой константой, содержащей символ пробела. Функция
strcat опять возвращает указатель на S и последний внешний вызов strcat добав-
ляет к уже сформированной строке текст строки S2.

Приведенный код будет работать, если есть уверенность, что сначала текст в S
отсутствует. Чтобы не зависеть от исходного текста в S, лучше вместо внутреннего
вызова strcat применить функцию

strcpy(S,Sl)

При анализе текстовых строк часто надо найти в одной из строк фрагмент тек-
ста, заданный в другой строке. Этот фрагмент, например, может быть некоторым
ключевым словом, символом и т.п. Эту задачу позволяет решить функция

strstr(Sl,S2)

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

Теперь давайте решим более сложную задачу. Пусть нам надо найти в строке
S1 первое вхождение текста строки S2 и, если поиск прошел удачно, то заменить
найденный фрагмент на текст, содержащийся в строке S3. Иначе говоря, требует-
ся произвести контекстную замену в S1 текста S2 на текст S3. Один из возможных
вариантов решения этой задачи приведен ниже.

char S1[20], S2[20], S3[20], S[60], *St;

// операторы занесения текста в S1, S2, S3

St = strstr(Sl,S2) ;

if(St)
f

*St = 0;

St += strlen(S2) ;

Labell->Caption = strcat(strcat(strcpy(S,S1),S3),St);

1
else Labell->Caption = "Текст не найден";

Помимо строк S1, S2, S3 в этом коде объявлена строка S, являющаяся буфе-
ром, в который будет помещаться текст с произведенной в нем заменой. Объявлен
также указатель на строку St. Он нам потребуется в качестве вспомогательной пе-
ременной.

Первый выполняемый оператор кода ищет с помощью функции strstr вхожде-
ние строки S2 в строку S1 и присваивает результат поиска переменной St. Если
функция strstr вернула нуль (это эквивалентно false), то печатается сообщение