Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Обработка строк текста.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.3 Mб
Скачать

9.3.2. Функции для работы со строками

Имеется несколько полезных функций:

П length (st) — вычисляет текущую длину в символах строки st. Результат имеет целочисленный тип.

Например, n:=length('123456789'}; { п=9 }

Обратите внимание— функция length возвращает выражение ord(s[0]), т. к. сам элемент s[0] имеет тип char. Некоторые программисты предпо­читают не использовать функцию length, обращаясь непосредственно к нулевому байту.

П copy (st,poz, n) — выделяет из строки st подстроку длиной п символов, начиная с позиции poz. Если poz больше длины строки, то результатом будет пустая строка.

Например:

si:='Turbo Pascal';

s2:=copy(si,1,5);

s3:=copy(si,7, 3);

{ в результате s2='Turbo'; s3='Pas' }

П concat (stri, str2,..., strn) — выполняет сцепление строк stri, str2, ... strn в том порядке, в каком они указаны в списке параметров.

Например: sr^concat('АД', 'XX', 'У'); { в результате s='AAXXY'; }

Функция concat выполняет те же действия, что и операция конкатена­ции. Например, для приведенного случая то же самое можно было запи­сать так: s:='AA'+'XX'+'Y';.

D pos(stri,str2) — обнаруживает первое появление в строке str2 подстро­ки stri. Результат имеет целочисленный тип и равен номеру той пози­ции, где находится первый символ подстроки stri. Если в str2 подстро­ки stri не найдено, результат равен 0.

Например:

sl:= 'Turbo Pascal';

nl:=pos('Pascal',si); n2:=pos('pascal', si);

|в результате nl=7; n2=0 (pascal и Pascal — это разные строки)}

Следующий фрагмент удаляет из строки первое слово вместе со следую­щим за ним пробелом. При этом предусматривается удаление ведущих пробелов:

while st[l]=' ' do deletefst,1,1); delete(si,1,роз(' ',sl));

9.3.3. Процедуры преобразования типов

Turbo Pascal позволяет преобразовывать данные числового типа в строку символов, а также преобразовывать строку в число, если она содержит по­следовательность символов, удовлетворяющую правилам записи чисел. Для этой цели имеется две процедуры: str и val.

Процедура str уже упоминалась, когда речь пила о выводе текста в графиче­ском режиме (см. разд. 8,4). Удобно использовать процедуру str для вставки числовых данных в какой-либо текст, т. к. операция конкатенации и про­цедура insert могут работать только со строковыми данными.

Вызов этой процедуры имеет вид:

О str (number, st) — преобразование числового значения величины number в строку st. После number может записываться формат, аналогичный формату вывода. Если в формате указано недостаточное для вывода ко­личество разрядов, поле вывода расширяется автоматически до нужной длины.

Например:

var Sl,S2,s3,s4 : string; numl:integer;num2:real;

numl:=5; num2:-5,18;

str (numl,SI);str (numl:3,s2}; str(num2,s3);str(num2:3:1,s4);

! в результате sl='5'; S2=' 5';s3='5.78QOOOOOOOOOE+00';s4='5.8'; }

Соответственно, процедура val часто используется, чтобы преобразовать введенную с клавиатуры или прочитанную из файла строку в числовые данные.

П val (st, number, code) — преобразует значение st в величину целочислен­ного или вещественного типа и помещает результат в numder. code — це­лочисленная переменная. Если во время операции преобразования ошибки не обнаружено, значение code равно нулю, если ошибка обнару­жена (строковое значение не переводится в цифровое), code будет содер­жать номер позиции первого ошибочного символа, а значение number не определено.

Например:

sl:= '5.78'; s2:= '5,78'; val(sl,numl,codl);

val(s2,num2,cod2);

{ в результате codl=0, cod2=2 — второй символ ошибочный }

Обратите внимание — использование функции val позволяет избежать не­приятной ошибки выполнения Invalid numeric format, возникающей при не­правильном вводе числовых данных. Приходится прибегать к такой хитро­сти — вводить вместо числовой переменной строковую (в ней разрешены любые символы). После этого введенная строка преобразуется в число и, если преобразование невозможно, об этом выводится сообщение на русском языке. Чаще всего в таких случаях не прерывают программу, а просят поль­зователя ПОВТОРИТЬ ВВОД. ЗдеСЬ ОЧеНЬ удобно ИСПОЛЬЗОВатЬ ЦИКЛ repeat, Т. К.

гарантируется выполнение тела цикла хотя бы один раз. Например:

var s:string; n,error:integer; begin

repeat

write ('Введите число ')/' ( просим ввести число, } readln(s); { а вводим строку }

val(s,n,error); { преобразуем строку в число } if error>0 then writeln('Неверный символ № ',error) until error=0; { продолжение программы }

Еще один способ решения той же самой проблемы ошибок ввода числовых данных, основанный на использовании функции ioresuit в цикле repeat, рассматривался ранее (см. разд. 3.9.1). Все же более универсальным вариан­том представляется использование вспомогательной строки, т. к. в эгом случае можно не просто проверить правильность ввода, но даже исправить некоторые ошибки при вводе.