Символьные массивы. Строки

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

Данная глава посвящена изучению средств системы программирования 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.  Как обратиться к отдельному элементу строки?

На главную.
Используются технологии uCoz