Укороченные строки
Память – жилище переменных – всегда чем-нибудь занята. Даже пустая строка (нулевой длины) занимает 256 байтов памяти, и содержит что либо. Это «что либо» программисты называют мусором, а мусор никому не интересен. Так разумно ли отводить 256 байтов для строки, если большая её часть забита всяким вздором? Ведь память – ценный ресурс, и профессионал бережет её. К примеру, для строки, хранящей фамилию, вполне хватило бы и 20 байтов.
Это понимали и создатели Паскаля, они позаботились об экономии памяти. Строковые типы можно объявлять с указанием длины. Для этого после слова STRING в квадратных скобках указывают нужный размер строки, например:
type TStrA = string[11]; { строка для 11 символов }
TStrB = string[31]; { строка для 31 символа }
var A : TStrA; B : TStrB;
Здесь объявлены два строковых типа данных; первый из них вмещает до 11 символов, а второй – до 31. Соответственно переменная A будет занимать в памяти 12 байтов, а переменная B – 32 байта (с учетом нулевого байта). Согласитесь, – экономия солидная, особенно для массива из таких строк. Во всем остальном, кроме размера, короткие строки ничем не отличаются от переменных типа STRING.
А что случится при копировании длинной строки в короткую? А ничего, – не вместившиеся символы будут «отрублены». Следующая ниже программа «P_44_1» подтверждает это, испытайте её.
{ P_44_1 – укороченные строки }
var S1 : string; { размер строки по умолчанию = 255 }
S2 : string[5]; { размер укороченной строки = 5 символов }
begin
S1:='abc'; S2:='abcdefgh';
Writeln('Строка S1: Размер =', SizeOf(S1):4,' Длина = ', Length(S1):4,' Значение= '+S1);
Writeln('Строка S2: Размер =', SizeOf(S2):4,' Длина = ', Length(S2):4,' Значение= '+S2);
Writeln('Нулевой байт строки S1 = ', Byte(S1[0]));
Writeln('Нулевой байт строки S2 = ', Byte(S2[0]));
Readln;
end.
Операции со строками
Итак, уяснив внутреннее устройство строк, обратимся к связанным с ними операциям. Что мы умеем делать со строками сейчас? А вот что:
• вводить и выводить строки процедурами ввода и вывода;
• объединять несколько строк в одну (складывать);
• определять длину строки функцией Length;
• проверять строки на равенство и неравенство;
• обращаться к отдельным символам строки (доступ по индексу).
Учитывая важность строкового типа, разработчики Паскаля предусмотрели для строк ещё несколько процедур и функций, позволяющих:
• искать одну строку внутри другой;
• копировать часть строки в другую строку;
• вставлять одну строку внутрь другой;
• удалять часть символов из строки;
• сравнивать две строки в смысле алфавитного порядка.
Рассмотрим всё это подробней. Представленные далее объявления процедур и функций даны мною лишь для пояснений, их не надо вставлять в программы.
Поиск в строке (Pos)
Функция Pos ищет одну строку внутри другой, её объявление выглядит так:
function Pos(SubS: string; S: string): Integer;
Функция принимает два параметра:
• SubS – подстрока, которую ищут (то есть фрагмент строки);
• S – строка, в которой ищут.
Если искомый фрагмент SubS найден, функция возвращает его позицию – индекс первого символа SubS внутри строки S, а иначе возвращает ноль. Если строка S содержит несколько искомых фрагментов, возвращается индекс первого из них. Вот примеры.
S:= 'BORLAND PASCAL';
p:= Pos('LA', S); { 4 }
p:= Pos('PAS', S); { 9 }
p:= Pos('pas', S); { 0 – подстрока не найдена }
p:= Pos('A', S); { 5 – первая из трех букв "A" }
Искомым фрагментом может быть и отдельный символ. Поиск ведется с учетом регистра; это значит, что заглавная и строчная буквы «P» считаются разными буквами.
Копирование части строки (Copy)
Функция Copy возвращает часть заданной строки.
function Copy(S: string; Index, Count: Integer): string;
Входных параметров три:
• S – строка, из которой копируются символы;
• Index – индекс первого копируемого символа;
• Count – количество копируемых символов.
А вот примеры её применения.
S:= ’Free Pascal forever!’;
T:= Copy(S, 6, 6); { ’Pascal’ }
T:= Copy(S, 6, 255); { ’Pascal forever!’ }
Если копируемых символов затребовано больше, чем содержится в исходной строке, то скопируются все символы до конца строки (как в последнем примере).
Вставка в строку (Insert)
Читать дальше