Символьные массивы. Строки
На сегодняшний день значительные мощности вычислительной техники и огромное количество разнообразного программного обеспечения используется для работы с текстовой информацией. По этой причине в программировании создаются специальные средства для работы с текстом, разрабатываются соответствующие приемы и методы программирования.
Данная глава посвящена изучению средств системы программирования Delphi, предназначенных для обработки фрагментов текста — строк.
Символьные массивы
Наиболее простым способом для работы с текстом является применение символьных переменных и линейных массивов, содержащих данные символьного типа (Char).
Var mas:array[1..80] of Char;
В этом случае необходимо использовать все правила, приемы и методы обработки массивов. Но как показывает практика, такой подход не совсем удобен. поэтому для работы с текстом в языке Delphi был введен специальный тип данных, предназначенный для работы с фрагментами текста — строками (цепочками символов).
Строки
Вам уже неоднократно приходилось в различных ситуациях пользоваться строками для вывода информации с помощью операторов Label, Edit, Memo, RichEdit (об использовании последних говорилось в предыдущей главе). Например:
Memo1.Text:='Текст, заключенный в апострофы — это и есть строка';
Символ номер 32 "апостроф" используется при работе со строковыми величинами так же, как и с символьными переменными. Если вам необходимо вывести символ номер 32 на экран, перед ним необходимо поставить дополнительную кавычку. Например:
Label1.Caption:='Строка с апострофом ' ' внутри.';
При выполнении этого оператора на экране монитора вы получите:
Строка с апострофом ' внутри.
Объявление строчных типов и переменных.
Для объявления строковых типов и переменных используется служебное слово STRING, вслед за которым в квадратных скобках указывается максимальная длина строки. Например:
Var s1:String[70];
или
Type Line:String[70];
Var s1:Line;
В приведенных выше примерах переменная s1в качестве своего значения может иметь любую последовательность символов (каждый из которых имеет тип char) произвольной длины (от 0 до 70 символов).
Определение значения строковой переменной.
Значение строковой переменной может быть присвоено оператором присваивания:
s1:='Пример строки';
В случае присваивания строковой переменной строкового выражения с длиной большей, чем максимально допустимая для данной переменной, происходит "обрубание" строки до максимальной длины. Эта ситуация не считается ошибочной, поэтому прерывания выполнения в данном случае не происходит, например:
Procedure TForm1.FormCreate(Sender:TObject);
Var ShtStr:String[5];
Begin
ShtStr:='Очень длинная строка';
Label1.Caption:=ShtStr; {Очень}
End;
Операция конкатенации.
Для строковых величин определена операция конкатенации "+";
Procedure TForm1.FormCreate(Sender:TObject);
Var s1:String[80];
Begin
s1:='Пример '+'строки';
Label1.Caption:=s1; {Пример строки}
End;
Длина строки
В Delphi для обработки строк предусмотрены следующие типы:
· короткая строка shortString или string [n] , где n <= 255;
· длинная строка string;
· широкая строка WideString;
· нуль-терминальная строка pchar.
Общим для этих типов является то, что каждая строка трактуется как одномерный массив символов, количество символов в котором может меняться в работающей программе: для string [n] длина строки меняется от 0 до n, для string и pchar - от 0 до 2 Гбайт.
В Паскале (основоположнике Delphi) используются только короткие строки String [n] . В памяти такой строке выделяется n+i байт, первый байт содержит текущую длину строки, а сами символы располагаются начиная со 2-го по счету байта. Поскольку для длины строки в этом случае отводится один байт, максимальная длина короткой строки не может превышать 255 символов. Для объявления короткой строки максимальной длины предназначен стандартный тип ShortString (эквивалент String[255]).
В Windows широко используются нуль-терминальные строки, представляющие собой цепочки символов, ограниченные символом #о. Максимальная длина такой строки лимитируется только доступной памятью и может быть очень большой.
Необходимость в нуль-терминальных строках возникает только при прямом обращении к API-функциям ОС. При работе с компонентами Delphi в основном используются более удобные длинные строки.
В 32-разрядных версиях Delphi введен новый тип string, сочетающий в себе удобства обоих типов. При работе с этим типом память выделяется по мере надобности (динамически) и ограничена имеющейся в распоряжении программы доступной памятью. Заметим, что в Delphi 1 тип string эквивалентен String [255], т. е. определяет короткую строку максимально возможной длины.
И несколько слов о широких строках. 32-разрядные версии Windows используют три сорта символов: однобайтный символ ANSI, двухбайтный символ и символ Unicode. Однобайтный символ связан с одним из 256 возможных значений, которые трактуются в зависимости от установленной в Windows национальной страницы (для размещения кириллицы используется страница 1251). 256 символов вполне достаточны для отображения национального алфавита любого европейского языка. Для отображения алфавитов некоторых азиатских языков этого недостаточно. В этом случае используется двухбайтный символ, в котором младший байт обычно кодируется семибитным ASCII-кодом, а старший указывает, как должен трактоваться этот код (каким символом он будет изображаться в документе или на экране). Символ Unicode в памяти занимает одно слово, которое имеет 65536 возможных значений. Специальная международная комиссия по Unicode выработала соглашение, позволяющее с помощью этого кода представить все символы всех языков мира. Двухбайтные символы и символы Unicode объявляются стандартным типом widechar, а составленные из них строки - типом widestring. Все Windows-программы, использующие OLE-технологию обмена строками, должны кодировать символы в соответствии с Unicode.
Процедуры и функции для работы со строками
Function AnsiLowerCase(const S: String): String; |
Возвращает исходную строку S, в которой все заглавные буквы заменены на строчные в соответствии с национальной кодировкой Windows (т. е. с учетом кириллицы) |
Function AnsiUpperCase(const S: String): String; |
Возвращает исходную строку s, в которой все строчные буквы заменены на заглавные в соответствии с национальной кодировкой Windows |
Function Concat(Sl [, S2, ..., SN]: String): String; |
Возвращает строку, представляющую собой сцепление строк-параметров S1, S2, ... , SN |
Function Copy(St: String; Index, Count: Integer): String; |
Копирует из строки St count символов, начиная с символа с номером Index |
Procedure Delete(St: String; Index, Count:" Integers- |
Удаляет count символов из строки St, начиная с символа с номером index |
Procedure Insert(SubSt: String; St, Index: Integer); |
Вставляет подстроку SubSt в строку St, начиная с символа с номером Index |
Function Length(St: String): Integer; |
Возвращает текущую длину строки St |
Function LowerCase(const S:String): String; |
Возвращает исходную строку S, в которой все латинские заглавные буквы заменены на строчные |
procedure OleStrToStrVar(Source: PWideChar; var Dest:String) ; |
Копирует “широкую” (двухбайтную) строку в обычную строку Object Pascal |
Function Pos(SubSt, St:String): Integer;
|
Отыскивает в строке St первое вхождение подстроки SubSt и возвращает номер позиции, с которой она начинается. Если подстрока не найдена, возвращается ноль |
Procedure SetLength(St:String; NewLength: Integer);
|
Устанавливает новую (меньшую) длину NewLength строки St. если NewLength больше текущей длины строки, обращение к SetLength игнорируется |
function StringOfChar(Ch:Char; Count: Integer):String; |
Создает строку, состоящую из Count раз повторенного символа ch |
function StringToOleStr(const Source: String):PWideChar; |
Копирует обычную строку в двухбайтную |
function StringToWideChar(const Source: String; Dest:PWideChar; DestSize: Integer) : PWideChar; |
Преобразует обычную строку в строку с символами UNICODE |
Function Uppercase(const S:String): String; |
Возвращает исходную строку S, в которой все строчные латинские буквы заменены на заглавные |
Подпрограммы преобразования строк в другие типы
Function StrToCurr(St: String): Currency; |
Преобразует символы строки St в целое число типа Currency. Строка не должна содержать ведущих или ведомых пробелов |
Function StrToDate(St: String): TDateTime; |
Преобразует символы строки St в дату. Строка должна содержать два или три числа, разделенных правильным для Windows разделителем даты (в русифицированной версии таким разделителем является “.”). Первое число - правильный день, второе - правильный месяц. Если указано третье число, оно должно задавать год в формате XX или ХХХХ. Если символы года отсутствуют, дата дополняется текущим годом. Например: DateToStr(StrToDate('28.06')) даст строку '28.06.99' (см. ниже пояснения) |
Function StrToDateTime(St: String): TDateTime;
|
Преобразует символы строки St в дату и время. Строка должна содержать правильную дату (см. StrToDate) и правильное время (см. StrToTime), разделенные пробелом, например: StrToDateTime('28.06 18:23') |
Function StrToFloat(St:String): Extended; |
Преобразует символы строки St в вещественное число. Строка не должна содержать ведущих или ведомых пробелов |
Function StrToInt(St:String): Integer; |
Преобразует символы строки St в целое число. Строка не должна содержать ведущих или ведомых пробелов |
Function StrToIntDef(St:String; Default: Integer):Integer;
|
Преобразует символы строки St в целое число. Если строка не содержит правильного представления целого числа, возвращается значение Default |
Function StrToIntRange(St:String; Min, Max: Longint):Lomgint; |
Преобразует символы строки St в целое число и возбуждает исключение ERangeError, если число выходит из заданного диапазона Min.. .мах |
Function StrToTime(St:String): TDateTime; |
Преобразует символы строки St во время. Строка должна содержать два или три числа, разделенных правильным для Windows раздели телем времени (для русифицированной версии таким разделителем является “:”). Числа задают часы, минуты и, возможно, секунды. За послед ним числом через пробел могут следовать символы “am” или “рm”, указывающие на 12- часовой формат времени |
Procedure Val(St: String; var X; Code: Integer); |
Преобразует строку символов St во внутреннее представление целой или вещественной переменной х, которое определяется типом этой переменной. Параметр Code содержит ноль, если преобразование прошло успешно, и тогда в х помещается результат преобразования, в противном случае он содержит номер позиции в строке St, где обнаружен ошибочный символ, и в этом случае содержимое х не меняется. В строке St могут быть ведущие и/или ведомые пробелы. Если St содержит символьное представление вещественного числа, разделителем целой и дробной частей должна быть точка независимо от того, каким символом этот разделитель указан в Windows |
Программы для обратного преобразования
Function DateTimeToStr(Value: TDateTime): String; Procedure DateTime-ToString(var St: String; Format: String;- Value: TData-Time); |
Преобразует дату и время из параметра в строку символов Преобразует дату и время из параметра value в строку St в соответствии со спецификаторами параметра Format (см. пояснения ниже) |
Function DateToStr(Value: TDateTime): String; |
Преобразует дату из параметра value в строку символов |
Function FloatToStr(Value: Extended): String; |
Преобразует вещественное значение value в строку символов. |
Function FloatToStrF(Value: Extended; Format: TFloatPor- mat; Precision, Digits: Inte ger) : String; |
Преобразует вещественное значение Value в строку символов с учетом формата Format и параметров precision и Digits (см. пояснения ниже). |
Function Format(const Format: String; const Args: array of const): Strings;
|
Преобразует произвольное количество аргументов открытого массива Args в строку в соответствии с форматом Format (см. пояснения ниже) |
Function FormatDateTime (Format: String; Value:.TDateTime): String; |
Преобразует дату и время из параметра value в строку символов в соответствии со спецификаторами параметра Format (см. пояснения ниже) |
Function FormatFloat(Format:String; Value: Extended): String; |
Преобразует вещественное значение value в строку символов с учетом спецификаторов формата Format (см. пояснения ниже) |
function IntToHex(Value: Integer; Digits: Integer):Strings; |
Преобразует целое число Value в строку символьного представления шестнадцатеричного формата: Digits - минимальное количество символов в строке |
Function IntToStr(Value: Integer) : String; |
Преобразует целое значение Value в строку символов |
Procedure Str(X [:Width[:Decimals]]; var St:String) ;
|
Преобразует число х любого вещественного илицелого типов в строку символов St; параметры width и Decimals, если они присутствуют, задают формат преобразования: width определяет общую ширину поля, выделенного под соответ ствующее символьное представление вещественного или целого числа х, a Decimals - количество символов в дробной части (этот параметр имеет смысл только в том случае, когда х -вещественное число) |
Function TimeToStr(Value: TDateTime): String; |
Преобразует время из параметра Value в строку символов |
Обычно разделителем групп разрядов в русской языке принято считать пробел. Однако в русифицированном варианте Windows для этих целей на самом деле используется, не пробел, а символ-#160, внешне похожий на пробел. Если вы действительно хотите использовать пробел, его нужно явно указать в окошке. Разделитель: групп разрядов (Пуск.| Настройка | Панель управления | Язык и стандарты | Числа).
Контрольные вопросы
1. Что такое строка?
2. Как объявляются переменные для хранения строк?
3. Какие типы строк существуют в Delphi и в чем их отличия?
4. Что такое текущая длина строки?
5. Объясните механизм хранения строк?
6. Опишите функции для работы со строками?
7. Опишите процедуры для работы со строками?
8. С помощью каких функций осуществляется перевод строк с другие типы?
9. Как используется символ №32?
10. Как обратиться к отдельному элементу строки?
На главную.