Программирование для гуманитариев

Другие типы данных

Разбить на страницы
Показывать лекцию целиком

7.1. Структуры, объединения и перечисления

Одним из преимуществ "новых" языков программирования (таких как "Паскаль", "Си") является появление "пользовательских" типов данных. В языке Си к таким данным относят структуры, объединения и перечисления. Рассмотрим их поподробнее.

Структура

Структура представляет собой несколько типов данных, расположенных вместе, в соседних ячейках памяти. Структура имеет собственное имя как тип данных, длина ее элемента (в памяти компьютера) вычисляется с помощью функции sizeof (в C и C++). Пример структуры следующий:

[Пример 01]

/* Инициализируем константу */

const unsigned short MAXSTRINGLENGTH = 256;

/* Описание структуры stringz */

struct stringz
{
	char string[MAXSTRINGLENGTH];
	short nLength;
}

Здесь определена структура с именем stringz, содержащая в себе массив string длиной MAXSTRINGLENGTH (в нашем случае - это 256 символов), и целым числом длиной 2 байта nLength, в котором может, например, храниться реальная длина строки.

Объединение

Объединение похоже на структуру, но в ней данные хранятся не вместе друг с другом, а вместо друг друга. Например, в следующем объединении с тегом data:

[Пример 02]

/* Объявление константы

const unsigned short STRDATALENGTH = 32:

/* Объявление объединения

union data{
	long intdata;
	double doubledata;
	char strdata[STRDATALENGTH];
}

Может храниться либо длинное целое, либо данные с плавающей точкой, либо массив-строка символов длиной 32 байта, причем все - в одних и тех же ячейках памяти. Функция sizeof, примененная к объединению, выдает значение самого длинного типа данных в объединении.

Обращение к элементам структуры и объединения осуществляется либо через знак "." (для переменной), либо знаком "->" (для указателей). Например:

[Пример 03]

/* Инициализируем константу */

const unsigned short MAXSTRINGLENGTH = 256;

/* Объявление переменных */

struct stringz aString, *theString;
union data aData, *theData;

/* Присвоение значений переменным */

aString.nLength = 5;
memset(theString -> string, '\0', MAXSTRINGLENGTH);

aData.intdata = 1;
theData -> doubledata = 7.0;

Перечисления

Перечисления иногда называют именованными типами данных. Их объявление на языке Си следующее:

enum <тег> {<константа 0>, <константа 1>, ... <константа n>};

Например:

[Пример 04]

/* определяет булевский тип данных */

enum boolean {FALSE, TRUE}

Переменные типа "перечисление" представляют собой целые переменные без знака, способные принимать значения только из списка: <константа 0> ... <константа n>, причем первой константе соответствует значение "0".

Переменную перечисления в Си можно привести к целому типу. Обратное действие вызывает неопределенность.

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

Замечание. Некоторые языки не поддерживают структуры. Тогда их можно эмулировать следующим образом:

[Пример 05]

stringZ$ = "Привет!"
stringZ% = 7

В этом примере вместо структуры stringz в языке Quick Basic используются переменные stringZ$ (для хранения символьных данных) и stringZ% для хранения целого числа.

7.2. Составные специальные типы

К составным специальным символьным типам данных автор относит такие типы данных, как класс "string" из библиотеки ClassLib в Borland C/C++, класс "String" стандартной библиотеки языка Java, класс "CString" в библиотеке MFC из пакета Microsoft Visual Studio и т.д. Эти классы частично заменяют такой примитивный символьный тип данных, как массив скаляров char[]. В стандартах на языки C++ и Sun Java 2 наличие таких предопределенных классов является обязательным. В таблице [[C_Tables.xls]07.I.] представлены стандартные методы классов "string" в Borland C/C++, "String" в Sun Java 2, "CString" в Microsoft MFC 2.0 и функции работы с символьными данными в Visual Basic Script.

Замечание: классы "String" в Sun Java 2 и "CString" в MFC 2.0 представляют символы только в кодировке Unicode.

В примерах [06 - 08] дается реализация алгоритмов Примера 01 лекции 6 с помощью классов "CString", "String" и "string" соответственно.

Замечание: к примеру 06. Несмотря на то, что класс "CString" содержит в себе данные в кодировке Unicode, текст для них пишется в 8-ми битной кодировке. Поэтому для перевода текста в кодировку Unicode используется функция: _T(...). В компиляторе Java 2 нет специальной функции для перевода 8-ми битных кодировок в Unicode.

[Пример 06]

// Определение переменной: <имярек>.
CString strImyaRek("Света");
// Определение переменной-результата.
Cstring strResult();
// Символьные вычисления.
strResult = _T("Привет ") + strImyaRek + _T("! С добрым утром.");

[Пример 07]

// Определение переменной: <имярек>.
string strImyaRek("Света");
// Определение переменной-результата.
string strResult();
// Символьные вычисления.
strResult.append("Привет ");
strResult += strImyaRek;
strResult.append("! С добрым утром.");

[Пример 08]

// Определение переменной: <имярек>.
String strImyaRek("Света");
// Определение временных переменных
strPrivet("Привет ");
strEnd("! С добрым утром.");
// Определение переменной-результата.
Cstring strResult();
// Символьные вычисления.
strResult = strPrivet + strImyaRek + strEnd;

Подробнее о символьных типах данных смотри следующую литературу:

  • примитивные символьные типы языка Си [31];
  • пример класса String, определенного в C++ [51];
  • диск с учебниками по программированию;
  • класс String в Java 2 [74];
  • класс CString в MFC 2.0 [Он-лайн руководство по Microsoft Visual C/C++];
  • класс string в ClassLib [Он-лайн руководство по Borland C/C++ 5.01];
  • описание языка Perl [59].
  • Замечания, касающиеся "взлома" программ

    Реализацию собственных символьных классов следует производить с осторожностью. Если класс закрыт от изменений, но при этом он возвращает свои защищенные значения, то хакер может получить ссылку на этот объект, и, изменяя содержимое этой ссылки, фактически он меняет содержимое этого защищенного элемента класса. Более подробно об этой проблеме смотри примеры в книге [74].

    Также к составным специальным символьным типам относят все переменные Perl. Подробнее о типах языках Perl см. лекцию 8.

    7.3. Массивы и указатели

    В разделах 6.2 и 7.1 уже использовалось понятие массива, правда, применительно только к примитивным символьным данным. Но массив, в принципе, может состоять из любых данных, в том числе и числовых, и типов-классов и структур, а также из других массивов. Массивы представляют собой смежные ячейки памяти, начиная с начального адреса массива и до последней ячейки памяти массива. Доступ к каждой ячейке памяти осуществляется по его индексу. С помощью индекса вычисляется адрес нужной ячейки по формуле:

    <адрес элемента> = <начальный адрес массива>+<индекс>*<длина типа данных>
    Примечание: формула 7.2 верна для тех языков, нумерация массивов для которых начинается с нулевого элемента. В языках Бейсик, ФОРТРАН и др. нумерация массива начинается с первого элемента, и первый множитель заменяется на (<индекс>-1).

    Индекс массива может меняться от 0 до N-1 или от 1 до N, где N - максимальный размер массива. Синтаксис объявления массива следующий:

    <тип> <переменная>[<N>]

    для языков Си, С++, Java, где N - максимальное число ячеек в массиве;

    DIM <переменная с типом>(<N>)

    для языка Бейсик

    [Пример 09]

    REM - определяет массив строк A$ из 10 переменных и матрицу вещественных чисел D размером 3х3;
    
    DIM A$(10), D(3,3)

    [Пример 10]

    /* - определяет массив строк A из 10 переменных и матрицу вещественных чисел d размером 3х3,
    а также массив примитивных символов array из десяти символов и указатель на символьный массив, которому можно назначить адрес имеющегося массива. */
    
    string A[10];
    double d[3][3];
    char *c, array[10];

    Индекс массива

    Для выбора одного из элементов массива используется его индекс. Индекс - порядковый номер элемента массива в отведенной для него области памяти. Операция нахождения значения ячейки массива по его индексу называется индексированием. Индексом может быть как целое число, так и целая переменная.

    [Пример 11]

    /* Задание типов элементам */
    
    char b, c, str[5];
    int i;
    
    ...
    
    /* Присвоение элементов: */
    
    c = str[5]; b = str[i];

    В приведенном примере символьным переменным b и c присваивается соответственно значение i -ой и третьей ячейки массива символьных данных str.

    Замечание. При определении класса операцию индексирования можно переопределять (иначе говоря, перегрузить). О перегрузке операций сказано в книге [51].

    Максимальный индекс массива определяется следующими способами:

  • Явное указание максимальных индексов целыми константами:

    [Пример 12]

    const short MAXNUMBER = 8;
    
    char str[7];
    short nIndexes[MAXNUMBER];
  • Определение элементов массива по количеству заранее предопределенных для него значений:

    [Пример 13]

    char str[] = "Привет!";
    short nIndexes[] = {5, 4, 6, 8, 7, 3, 1, 2};
  • Как видно, при определении индексов этим способом квадратные скобки остаются пустыми.

    Указатели

    Кроме массивов, для обращения к переменной по ее адресу можно пользоваться указателем на переменную указанного типа. Указатели есть в языках Си, C++ и Java, но отсутствует во многих "старых" языках, таких как ФОРТРАН и Quick Basic.

    Синтаксис определения указателя следующий:

    <тип> *<имя переменной>

    Замечание. Как уже отмечалось в примере 10, массивы можно определить как указатели. Однако это нужно делать в следующих случаях:

  • При передаче массива как параметра функции;
  • Для создания динамических массивов, то есть массивов, размещенных в памяти ЭВМ с помощью функций new, calloc, malloc и других функций выделения памяти. После окончания использования массива память следует освободить функциями delete, free и др.
  • После определения указателя, например, после объявления:

    char *c, a, d='a';

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

    c = (char *) malloc( sizeof( char ) );

    или присвоить ей адрес существующей ячейки памяти:

    c = d;

    Для того чтобы получить значение ячейки памяти, после присвоения адреса по формуле 7.8, можно использовать следующий оператор:

    a = *c;

    В этом случае переменной a будет присвоено значение 'a', а после присвоения:

    *c = 'b';

    переменной d будет присвоено значение 'b'

    Замечание. Не следует присваивать указателю - адресной переменной значение какой-либо другой переменной, отличной от ее адреса. В этом случае генерируется ошибка компилятора:
    c = a; (компилятор выдаст ошибку!)
    Замечание. При присвоении указателя необходимо обязательно указывать его тип. В этом (и только в этом) случае компилятор корректно обрабатывает код программы, вычисляет размер ячейки памяти и т.п. Если по логике программы необходимо изменить тип указателя, делайте эту операцию явно, например:

    [Пример 14]

    /* Описание переменных */
    
    char *c, d='a';
    unsigned char *u;
    
    /* Присвоение указателей */
    
    c = d;
    u = (unsigned char *)c;

    В результате в переменной u хранится содержимое ячейки d "как есть". Переменная c будет по-прежнему иметь тип char * (указатель на тип char).

    В некоторых функциях используется указатель на "пустой" тип: void *. Перед использованием этого указателя необходимо присвоить (переопределить) его на указатель на необходимый тип данных.

    [Пример 15]

    /* Определение переменных */
    
    char *c;
    
    /* Присвоение указателей: */
    
    c = (char *) malloc( sizeof( char ) );

    Чтобы присвоить переменной-указателю адрес выделенной ячейки памяти, необходимо явно изменить тип возвращаемого значения функции malloc (по-умолчанию функция malloc возвращает тип: "void *").

    Ссылки

    Ссылка - это "разыменованный" указатель. Она обозначается как <тип> <переменная>. В основном она применяется в параметрах функции. Пусть, например, объявлена функция:

    void func( int a, int *b, int c);

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

    Второй параметр передает в качестве фактического параметра указатель на переменную. Если теперь "разыменовать" этот указатель, то значение переменной, на которую указывает указатель, может меняться, но адрес переменной после окончания функции потеряет все сделанные изменения.

    Наконец, третий параметр функции сочетает в себе достоинства обоих способов передачи параметров. Так, ссылку, как и переменную, передаваемую "по значению", не надо разыменовывать. Однако, после выхода из функции, новое значение предаваемой "по ссылке" переменной сохраняется. Поэтому вызов функции func, определенное в [7.12], будет следующим:

    func( i, i, i );

    где i - целая переменная - "фактический параметр".

    Замечание. Передача данных "по ссылке" является потенциально опасной с точки зрения "безопасности" хранения и изменения данных. Поэтому не злоупотребляйте ее использованием!

    7.4. Списки

    Списки представляют собой примерно такую же последовательность данных, как и массивы. Они отличаются друг от друга следующим образом:

  • У списков нет индекса, а значит обращение к его любому значению напрямую невозможно:
  • Получить доступ можно только к его первому элементу (голове списка), а ко всем последующим - только через метод next() ;
  • Элементы (узлы) списка могут размещаться в любых ячейках памяти, а не только подряд. Почему - см. следующий пункт;
  • Тип "список" может быть реализован, например, следующим образом:

    [Пример 16]

    struct list_node{
    	union data datum_node;
    	struct list_node *next_node;
    }
    где data - объединение из примера 02. Этот элемент, в принципе, может иметь любой тип: как примитивный, так и определенный тип-класс. Второй элемент, имеющий тип: struct list_node * (указатель на собственный тип), является обязательным. В этом указателе находится либо адрес следующего элемента списка-узла ("node" по-английски - "звено, узел"), или нулевой указатель (обозначение - NULL), если это последний элемент списка. Поскольку указатель (адрес звена) может принимать любое значение, то расположение звеньев в памяти может быть любым;
  • Размер списка, в принципе, может быть любым.
  • С первого взгляда кажется, что использование списка, по сравнению с массивом, неудобно. Но это неудобство происходит только при работе с "императивными" алгоритмами, для которых существует только одна, основная последовательность в реализации алгоритма. Однако существуют также и "декларативные" алгоритмы, в которых задаются (описываются) только исходные данные, цель задачи, а алгоритм нахождения цели "встроен" в реализации языка и скрыт от программиста. На "декларативных" алгоритмах основана функциональная парадигма программирования (язык LISP) и логическая парадигма программирования (язык PROLOG). В этих языках вполне естественно (из логики построения программы) заменить произвольный доступ к элементам массива на доступ к "голове" (начальному элементу) и "хвосту" (остальной части) списка. Более подробно о языке Turbo Prolog смотри [files/prolog.zip] материалы по языку: "Турбо Prolog".

    7.5. Резюме

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

    Среди пользовательских типов данных Вы познакомились со структурами и объединениями. Специальные же типы "отметились" массивами и указателями на тип данных. Хотя в примерах рассматривались в основном "машинные" типы данных, в языках программирования можно использовать массивы и указатели на любые символьные данные, в том числе можно создавать массивы указателей и массивы пользовательских данных.

    Автор особо хотел бы остановить внимание на другом специальном типе данных - списке. Хотя списки практически не встречаются в "процедурных" языках программирования (их реализация имеется только в библиотеке ClassLib Borland C/C++), они очень широко используются при анализе текстов, грамматическом разборе приложениях, и других алгоритмах искусственного интеллекта. Поэтому автор советует изучить этот тип данных самостоятельно.

    7.6. Глоссарий

    Термин Английский термин Разъяснение
    специальный символьный тип данных special symbol data type Символьный тип данных, реализованный в виде классов. К специальным символьным типам данных относят классы: "string" из библиотеки ClassLib Borland C/C++, "CString" из библиотеки MFC Microsoft Visual C/C++, стандартный класс языка Java - "String" и др. Как правило, текст внутри переменных такого типа не меняется!
    массив array Представляет собой смежные ячейки памяти, начиная с начального адреса массива, и до последней ячейки памяти массива. Доступ к каждой ячейке памяти массива осуществляется при помощи его индекса.
    индекс index Порядковый номер ячейки массива. В Си-подобных языках индекс первой ячейки начинается с 0.
    Си подобные языки C based languages Языки программирования, имеющие синтаксис и обозначения, сходные с принятыми обозначениями в языке Си. К Си-подобным языкам автор относит: C++, C#, Java, Perl, Python, C--, JScript и др.
    структура structure Представляет собой несколько типов данных, расположенных вместе, в соседних ячейках памяти. Структура как тип данных имеет собственное имя, длина ее элемента вычисляется с помощью функции: sizeof.
    объединение union Представляет собой несколько типов данных, расположенных в одной ячейке памяти вместо друг друга. Объединение имеет собственное имя как тип данных.
    перечисления enumerate Представляет собой целые переменные без знака, способные принимать значения только именованных констант, причем первой константе присваивается значение 0.
    пользовательский тип данных users' data type Тип данных, созданный системным или прикладным программистам для собственных нужд. К пользовательским типам данных на языке Си относят классы, структуры, объединения и перечисления.
    именованный тип данных denominate data type Целый тип данных, значения (константы) для которых записаны как имена (идентификаторы). Это позволяет использовать в различных операциях вместо безликого числа некоторого "осмысленного имени", что улучшает "читабельность" программы. На языке Си именованные константы вводятся оператором enum или прагма оператором #define.
    константа constant Число или символьная строка, не меняющаяся во время исполнения программ. Именованная константа - переменная с неизменным значением. Константа имеет определенный тип данных.
    переменная variable Идентификатор, обозначающий ячейку памяти для хранения данных со значением определенного типа. Этот идентификатор называется именем переменной.
    идентификатор identification Любая последовательность латинских букв и цифр, начинающаяся с латинской буквы. Идентификаторы служат именами констант и переменных.
    модификатор modification Идентификатор, служащий для уточнения и/или изменения значения по-умолчанию для указателей, типов данных и т.п.
    целая константа integer constant Переменная (идентификатор), имеющее постоянное неизменное целое значение. В языке Си эти константы объявляются либо прагма оператором #define, либо оператором const int.
    явное указание максимальных индексов strict direction of ultimate index Указание максимального значения индекса массива в процессе его создания или объявления без инициализации. Если массив указан как последовательность типов данных, то это значение изменить нельзя без удаления и повторного создания массива.
    неявное указание максимального индекса implicit direction of ultimate index Указание максимального индекса массива при его объявлении с инициализацией. Это значение определяется количеством констант (символов) в строке, которой инициализируется массив. При неявном указании максимального значения индекса его значение изменить уже нельзя!
    указатель 1. pointer 1. Целая переменная, хранящая адрес переменной или константы заданного типа. В Си-подобных языках обозначения массива и указателя эквивалентны.
    указатель 2. pointer 2. Целая переменная, хранящая в себе адрес другой переменной (или массива) указанного типа. В языке Си указателем является специальный тип - "адресная переменная" того типа данных, на которое указывает указатель. Это делает невозможным (так надо!) применения целочисленных операций над указателями.
    NULL-указатель NULL 1. См. пустой (нулевой) указатель. Используется в языке Си.
    пустой (нулевой) указатель empty (zero) pointer Указатель, принимающий нулевое целое значение. При попытке обращения к "пустому" указателю генерируется отказ системы ("NULL pointer assigned). Это значение указателя используется в специальных целях.
    ссылка link "Разыменованный" указатель, которой в операции присвоения используется как переменная, а в параметрах функции - как адрес этой переменной. Ссылки следует использовать с осторожностью!
    список list Структура данных, представляющее собой "значение" и ссылку на следующий элемент списка. Обратиться к элементу списка можно через голову списка и многократному применению методов next.
    голова списка head of the list Адрес первого элемента списка.
    хвост списка tail of the list Все элементы списка, расположенные после текущего элемента. Хвост списка может быть пустым.
    метод next next (method) Ищет адрес следующего элемента списка. Возвращает значение: NULL, если текущий элемент списка - последний.
    NULL NULL 2. "Нулевой символ" при адресации памяти. При обращении программы по этому адресу выводится сообщение: "NULL pointer assigned", и программа перестает выполняться.

    7.7. Приложение

    В таблицах 7.1 - 7.7 Дан список основных функций работы с символьными данными.

    Символьные типы данных
    Тип данных Префикс/Окончание Разрядность регистров/длина Примечание
    Quick Basic
    STR <идентификатор>$ Переменная длина (до 255 символов) Для хранения 1 символа в кодировке ASCII. Не защищен от изменений.
    VB Script
    Variant в зависимости от конкретного значения Переменная длина Используется для хранения всех видов данных.
    Java
    char с 2 байта Для хранения одного символа в кодировке Unicode
    String str Переменная длина Класс для хранения символов в кодировке Unicode. Защищено от изменений!
    javascript
    variant в зависимости от конкретного значения Переменная длина Используется для хранения всех видов данных.
    C/C++
    char с 1 байт Для хранения одного символа в кодировке ASCII (со знаком)
    unsigned char uc 1 байт Для хранения одного символа в кодировке ASCII (без знака)
    char * pc от 2 до 4 байт Указатель на массив (переменной длины)
    unsigned char * puc от 2 до 4 байт Указатель на массив (переменной длины)
    C/C++ Windows API
    BYTE b 1 байт Эквивалентен unsigned char
    NPSTR npsz 2 байта Эквивалентен char near *
    LPSTR lpch 4 байта Эквивалентен char far *
    LPCSTR lpsz 4 байта Эквивалентен const char far *
    C++ MFC
    CString cstr, str Переменная длина Класс для хранения символов в кодировке Unicode. Защищено от изменений!
    C++ Classlib
    string str Переменная длина Класс для хранения символов в кодировке ASCII (и Unicode?). Защищено от изменений!
    Функции для работы с текстом
    Группа функций Функция/Метод Описание Пример
    Язык С++. Функции MFC для Microsoft Visual Studio
    Конструктор CString Конструктор объекта CString различными способами.
    Строка как массив GetLength Возвращает число символов в строке.
    IsEmpty Проверяет, является ли строка пустой (т.е. она состоит из 0 символов).
    Empty Удаляет из строки все символы.
    GetAt Возвращает символ в текущей позиции.
    operator [] Функция аналогична функции: GetAt
    SetAt Записывает символ в указанную позицию.
    operator LPCTSTR Прямой доступ к символам текущей строки в формате языка Си.
    Присвоение и конкатенация operator = Назначает новое значение строки объекту.
    operator + Операция конкатенации двух строк.
    operator += Операция конкатенации второй строки к концу первой.
    Сравнение operator == <, etc. Операторы сравнения (чувствительные к регистру).
    Compare Сравнение двух строк (чувствительное к регистру).
    CompareNoCase Сравнение двух строк (без учета регистра).
    Извлечение Mid Выделяет среднюю часть строки (как функция MID$ в Бейсике).
    Left Выделяет левую часть строки (как функция LEFT$ в Бейсике).
    Right Выделяет правую часть строки (как функция Бейсика RIGHT$).
    SpanIncluding Выделяет подстроку, которая содержит только символы из данного множества;
    SpanExcluding Выделяет подстроку, которая содержит символы, не входящие в указанное множество.
    Другие преобразования MakeUpper Преобразует все символы в строке в верхний регистр.
    MakeLower Преобразует все символы в строке в нижний регистр.
    MakeReverse Изменяет порядок символов в строке на обратный порядок следования символов.
    Format Форматирует строку в соответствии со спецификацией sprintf.
    TrimLeft Обрезает "лидирующие", начальные пробелы в строке.
    TrimRight Обрезает "хвостовые" пробелы в строке.
    FormatMessage Форматирует строку сообщения.
    Поиск Find Ищет символ или подстроку внутри текущей строки.
    ReverseFind Ищет символ или подстроку внутри текущей строки, начиная с ее конца.
    FindOneOf Finds the first matching character from a set.
    Архивация/Дамп operator << Помещает строку в выходной поток данных.
    operator >> Читает строку из входного потока данных.
    Buffer Access Функции манипуляции с буфером
    GetBuffer Возвращает указатель на символы из строки.
    GetBufferSetLength Возвращает указатель на символы из строки CString, урезанную по указанной длине.
    ReleaseBuffer Удаляет буфер для хранения строки данных.
    FreeExtra Удаляет все заголовки этого строкового объекта, предварительно размещенного во внешней памяти,
    LockBuffer Делает ссылку на строку активной (т.е. к размещенной строке командой GetBuffer, можно обращаться).
    UnlockBuffer Делает ссылку на строку не активной, разрешая операционной системе произвольно перемещать буфер в памяти.
    Специфичные для Windows AllocSysString Размещает BSTR из данных CString
    SetSysString Устанавливает текущий BSTR объект данными из CString объекта.
    LoadString Загрузить существующую строку из ресурсов Windows.
    AnsiToOem Преобразует строку символов из формата ANSI в OEM в соответствии с заданными национальными настройками.
    OemToAnsi Преобразует строку символов из формата OEM в формат ANSI в соответствии с национальными настройками операционной системы.
    Функции для работы с текстом
    Функция/Метод Синтаксис Описание Пример
    Язык С++. Функции ClassLib Borland C/C++
    Header File cstring.h
    Конструкторы: string::string
    Данные - члены класса: StripType
    Публичные методы:
    ansi_to_oem void ansi_to_oem(); перевод текста строки из кодировки ANSI в кодировку OEM (согласно установленному национальному стандарту)
    append string _FAR append( const string _FAR s );

    string _FAR append( const string _FAR s, size_t start, size_t n = NPOS );

    string _FAR append( const char _FAR *cp, size_t start, size_t n = NPOS );
    добавляет заданную строку s к текущей строке.
    assign string _FAR assign( const string _FAR s );

    string _FAR assign( const string _FAR s, size_t start, size_t n = NPOS );

    compare int compare(const string _FAR s) const throw();

    int compare(const string _FAR s, size_t orig, size_t n = NPOS ) const throw();

    строка s сравнивается с исходной строкой в лексикографическом порядке, и выдается значение: меньше нуля, если исходная строка меньше s, 0, когда строки равны и больше нуля, когда исходная строка больше s.
    contains int contains(const char _FAR * pat) const;

    int contains(const string _FAR s) const;

    проверяется вхождение строки s (или pat) в текущую строку. Возвращает 1 если строка входит в текущую строку, и 0, если не входит.
    copy size_t copy( char _FAR *cb, size_t n = NPOS );

    size_t copy( char _FAR *cb, size_t n, size_t pos );

    string copy() const throw( xalloc ).;
    функция копирует n символов в строку cb из текущей строки. Возвращает точное число скопированных символов. В третьей форме синтаксиса функция возвращает собственную копию;
    c_str const char _FAR *c_str() const;
    find size_t find( const string _FAR s );

    size_t find( const string _FAR s, size_t pos );

    Возвращает позицию первого вхождения подстроки s в текущую строку.
    find size_t find( const TRegexp _FAR pat, size_t i = 0 );

    size_t find( const TRegexp _FAR pat, size_t _FAR *ext, size_t i = 0 ) const;

    Возвращает позицию первого вхождения подстроки с шаблоном регулярного выражения pat в текущую строку, начиная с позиции i. Число i сообщает длину строки, совпадшей с шаблоном.
    find_first_of size_t find_first_of( const string _FAR s ) const;

    size_t find_first_of( const string _FAR s, size_t pos ) const;

    возвращает первый символ из текущей строки, совпавший с любым символом из строки s.
    find_first_not_of size_t find_first_not_of( const string _FAR s ) const;

    size_t find_first_not_of( const string _FAR s, size_t pos ) const;

    find_last_of size_t find_last_of( const string _FAR s ) const;

    size_t find_last_of( const string _FAR s, size_t pos ) const;

    find_last_not_of size_t find_last_not_of( const string _FAR s ) const;

    size_t find_last_not_of( const string _FAR s, size_t pos ) const;

    get_at char get_at( size_t pos ) const throw( outofrange ); возвращает символ в указанной позиции pos.
    get_case_sensitiveFlag static int get_case_sensitive_flag(); Возвращает значение 0, если сравнение чувствительно к регистру букв.
    get_initial_capacity static unsigned get_initial_capacity();
    get_max_waste static unsigned get_max_waste();
    get_paranoid_check static int get_paranoid_check();
    get_resize_increment
    static unsigned get_resize_increment();
    get_skipwhitespace_flag static int get_skipwhitespace_flag(); возвращает 1, если при поиске пропускаются пробельные символы.
    hash unsigned hash() const; Выдает значение хеш величины типа данных;
    initial_capacity static size_t initial_capacity(size_t ic = 63);
    insert string _FAR insert( size_t start, const string _FAR s );

    string _FAR insert( size_t pos, const string _FAR s, size_t start, size_t n = NPOS );

    Вставляет pos символов из строки s в текущую строку, начиная с позиции start.
    is_null int is_null() const; Возвращает 1, если строка пустая;
    length unsigned length() const; возвращает длину текущей строки.
    MaxWaste static size_t MaxWaste(size_t mw = 63); задает максимальное число пробельных символов и расширяет строку.
    oem_to_ansi void oem_to_ansi(); функция преобразует строку из кодировки oem в кодировку ANSI согласно указанным региональным стандартам.
    prepend string _FAR prepend( const string _FAR s );

    string _FAR prepend( const string _FAR s, size_t start, size_t n = NPOS );

    string _FAR prepend( const char _FAR *cp );

    string _FAR prepend( const char _FAR *cp, size_t start, size_t n = NPOS );

    Функция прибавляет к началу текущей строки строку s, начиная с позиции start.
    put_at void put_at( size_t pos, char c ) throw( outofrange ); записывает в позицию pos символ c.
    read_file istream _FAR read_file(istream _FAR is); читает файл из входящего потока в строку;
    read_line istream _FAR read_line(istream _FAR is); читает строку файла из указанного потока в строку, пока не достигнут знак "перевод строки" или "конец файла".
    read_string istream _FAR read_string(istream _FAR is); читает строку файла из указанного потока в строку, пока не достигнут знак "\0" или "конец файла".
    read_to_delim istream _FAR read_to_delim(istream _FAR is, char delim = '\n'); читает строку файла из указанного потока в строку, пока не достигнут знак delim или "конец файла".
    read_token istream _FAR read_token(istream _FAR is); читает строку файла из указанного потока в строку, пока не достигнут пробельный символ или "конец файла". Пустые строки в начале файла игнорируются.
    rfind size_t rfind( const string _FAR s );

    size_t rfind( const string _FAR s, size_t pos );

    возвращает последний символ из текущей строки, совпавший с любым символом из строки s.
    remove string _FAR remove( size_t pos );

    string _FAR remove( size_t pos, size_t n = NPOS );

    удаляет часть текущей строки (длиной n или до конца строки), начиная с позиции pos.
    replace string _FAR replace( size_t pos, size_t n = NPOS, const string _FAR s );

    string _FAR replace( size_t pos, size_t n1, const string _FAR s, size_t start, size_t n2 );

    удаляет, по крайней мере, n (n1) позиций из текущей строки, начиная с позиции pos, и заменяет ее, по крайней мере, n2 позициями строки s, начиная с позиции start (или всей строкой s).
    reserve size_t reserve() const;

    void reserve( size_t ic );

    resize void resize(size_t m); увеличивает длину строки на m байт.
    resize_increment static size_t resize_increment(size_t ri = 64); устанавливает инкремент для автоматического изменения длины строки в ri байт.
    set_case_sensitive static int set_case_sensitive(int tf = 1); устанавливает чувствительность к регистру символов при сравнении строк: 1 - чувствительный к регистру, 0 - не чувствительный.
    set_paranoid_check static int set_paranoid_check(int ck = 1);
    skip_whitespace static int skip_whitespace(int sk = 1); Устанавливается в единицу, чтобы пропускать пробельные символы при чтении слов (цепочек), или 0 в противном случае;
    strip TSubString strip( StripType s = Trailing, char c=' '); удалят из текущей строки все пробельные или заполняющие с символы вначале, в конце строки или в обоих направлениях, и выдается ссылка на результирующую строку типа TSubString.
    substr string substr( size_t pos ) const;

    string substr( size_t pos, size_t n = NPOS ) const;

    возвращает подстроку из текущей строки, начинающейся с позиции pos текущей строки.
    substring TSubString substring( const char _FAR *cp );

    const TSubString substring( const char _FAR *cp ) const;

    TSubString substring( const char _FAR *cp, size_t start );

    const TSubString substring( const char _FAR *cp, size_t start ) const;

    создает объект типа TSubstring, содержащей копию строки cp.
    to_lower void to_lower(); переводит строку в нижний регистр;
    to_upper void to_upper(); переводит символы строки в верхний регистр.
    Protected Member Functions
    valid_element int valid_element( size_t pos ) const; возвращает 1, если в позиции pos находится элемент строки, и 0 в противном случае.
    valid_index int valid_index( size_t pos ) const; возвращает 1, если pos нормальный индекс строки символов, и 0 в противном случае.
    assert_element
    assert_index
    cow
    Operators =; +=; +=; +; []; (); ==; !=; <; <=; >; >=;
    Related Global Operators and Functions >>; <<; +; getline; to_lower; to_upper;
    Функции для работы с текстом
    Функция/Метод Описание Пример
    Java. Методы класса String
    charAt(Позиция) Возвращает символ строки, стоящий в заданной позиции. Позиции отсчитываются с 0.
    compareTo( Любая_строка) Сравнивает вызывающий строковый фрагмент и строковый аргумент на предмет первенства в лексикографическом порядкеЛексикографический порядок (lexicographic ordering) совпадает с с упорядочением по алфавиту, когда строки набраны либо прописными, либо строчными буквами. Если вызываемая строка опережает документ, метод возвращает отрицательное значение, Если две сравниваемые строки равны, метод возвращает нулевое значение. Если аргумент опережает вызывающую строку, метод возвращает положительное значение. String entry = "adventure".

    Выражение: entry.compareTo("zoo") возвращает отрицательное число.

    Выражение: entry.compareTo("adventure") выдаст 0.

    Выражение: entry.compareTo("above") выдаст положительное число.

    equals(Другая_строка) Возвращает true, если вызывающий объект является строкой и равен объекту Другая_строка. В противном случае возвращает false.
    equalsIgnoreCase (Другая_строка) Возвращает true, если вызывающий объект является строкой и равен объекту Другая_строка без учета регистра букв. В противном случае возвращает false.
    indexOf( Любая_строка) Возвращает позицию первого вхождения строки: Любая_строка в строковом объекте. Позиция отсчитывается с 0. Возвращает "-1", если Любая_строка не найдена.
    indexOf( Любая_строка, Начало) Возвращает позицию первого вхождения строки: Любая_строка в строковом объекте, после позиции Начало. Позиция отсчитывается с 0. Возвращает "-1", если Любая_строка не найдена.
    lastIndexOf( Любая_строка) Возвращает позицию последнего вхождения строки: Любая_строка в строковом объекте. Позиция отсчитывается с 0. Возвращает "-1", если Любая_строка не найдена.
    length() Возвращает длину строкового фрагмента. String strgreeting = "Привет!". Выражение: Strgreeting.length() возвращает 7.
    substring(Начало) Возвращает подстроку строкового фрагмента, начинающегося с позиции Начало и оканчивающегося концевым символом строки. Позиции отсчитываются от 0.
    substring(Начало, Конец) Возвращает подстроку строкового фрагмента, начинающегося с позиции Начало и оканчивающегося позицией Конец. Позиции отсчитываются от 0.
    toLowerCase() Возвращает исходную строку символов, все символы у которой - строчные.
    toUpperCase() Возвращает исходную строку символов, все символы у которой - прописные.
    trim() Удаляет в возвращаемой строке ведущие и концевые пробелы.
    Функции для работы с текстом
    Функция/Метод Описание Пример
    VB Script функции
    Asc Функция возвращает ASCII код символа или первого символа в строке. Asc("A") - возвращает 65, а Asc("Russia") - 82.
    Chr Эта функция возвращает ASCII символ по ASCII коду. Chr(65) - возвращает "A".
    Instr Функция используется для получения местоположения одной строки в другой. Функция имеет следующий синтаксис: Instr([Begin_Pos], Str1, Str2, [ComparisionType]), - где Begin_Pos - необязательный элемент, задающий начальную позицию поиска, Str1 - строка, в которой происходит поиск, Str2 - исходная строка, ComparisionType - способ сравнения: 0 - бинарное сравнение (по умолчанию), 1 - сравнение с игнорированием регистра букв.
    LCase Возвращает исходную строку символов, все символы у которой - строчные.
    Left Функция возвращает определенное число символов из строки. Выражение: Left("VBScript for Internet", 8) - возвращает "VBScript".
    Len Функция возвращает число символов в строке. Len("Привет!") - выдает число 7.
    LTrim Функция удаляет предшествующие пробелы из строки.
    Mid Возвращает определенное число символов из строки. Выражение: Mid("VBScript for Internet", 0. 8) - возвращает "VBScript".
    Right Функция возвращает определенное число символов с правой стороны строки. Right("VBScript", 6) - возвращает "Script"
    RTrim Функция удаляет последующие пробелы из строки.
    Str Эта функция преобразует цифровое выражение в строку.
    StrComp Эта функция используется для сравнения двух строк в лексикографическом порядкеЛексикографический порядок (lexicographic ordering) совпадает с с упорядочением по алфавиту, когда строки набраны либо прописными, либо строчными буквами. Если вызываемая строка опережает документ, метод возвращает отрицательное значение, Если две сравниваемые строки равны, метод возвращает нулевое значение. Если аргумент опережает вызывающую строку, метод возвращает положительное значение. , и имеет синтаксис: StrComp( Str1, Str2, CompMeth), - где CompMeth - метод сравнения: 0 - бинарное, 1 - игнорирование регистра символов. Если Str1 равно Str2, то значение - "0", если Str1 < Str2, то значение - "-1", если Str1 > Str2, то значение - "1".
    String Функция предназначена для заполнения строки определенным числом символов. String(10, "A") - вернет строку "AAAAAAAAAA".
    Trim Функция удаляет и предшествующие, и последующие пробелы из строки.
    UCase Возвращает исходную строку символов, все символы у которой - прописные.
    Функции для работы с текстом
    Функция/Метод Описание Пример
    Язык Си. Функции ANSI C
    #include <string.h> Заголовочный файл для этих функций
    int strlen( char *str ); Возвращает длину строки str1 (позицию его символа \0).
    char* strerror( char *str );
    char *strncat( char *str1, char *str2, unsigned int n ); Конкатенация строки str1 и str2, но в строку n записывается не более n символов. Возвращается значение строки str1 или NULL при неудаче конкатенации.
    int strncmp( char *str1, char *str2, unsigned int n ); Сравниваются не более чем n символов в строке str1 со строкой str2 в лексикографическом порядке. Возвращает: "0" - если строки совпали, "-1" - если str1 < str2, "1" - если str1 > str2.
    char *strncpy( char *str1, char *str2, unsigned int n ); Копирует строку str2 в строку str1, но не более чем n символов. Возвращается значение строки str1 или NULL при неудаче копирования.
    char *strpbrk( char *str1, char *str2 ); Ищется первое вхождение символа из строки str2 в строке str1. Возвращает указатель на этот символ или NULL, если символы не обнаружены.
    char *strrchr( char *str1, char *str2 ); Ищется последнее вхождение символа из строки str2 в строке str1. Возвращает указатель на этот символ или NULL, если символы не обнаружены.
    char *strspn( char *str1, char *str2 ); Ищется первое вхождение символа, которого нет в строке str2, в строке str1. Возвращает указатель на этот символ или NULL, если символы не обнаружены.
    char *strstr( char *str1, char *str2 ); Ищется первое вхождение подстроки str2 в строке str1. Возвращается указатель на заданную подстроку или NULL в случае ее необнаружения.
    char *strtok( char *str1; char *str2 ); Функция разбивает строку str1 на слова, вставляя после каждого из них символ '\0'. Символы, являющиеся разделителями слов, перечислены в строке str2. При первом вызове функция возвращает указатель на str1. При последующем вызове (с параметром str1 == NULL) она возвращает указатели на другие слова в строке str1. Функция возвращает NULL, если все слова закончились.
    char *memchr( char *buf, char sim, unsigned cnt ); Функция ведет поиск первого вхождения символа sim в не более чем cnt символов с начала строки buf. Возвращает указатель на символ sim в случае его нахождения или NULL если он не найден.
    int memcmp( char *buf1, char *buf2, unsigned cnt ); Сравниваются не более чем cnt символов в строке buf1 со строкой buf2 в лексикографическом порядке. Возвращает: "0" - если строки совпали, "-1" - если buf1 < buf2, "1" - если buf1 > buf2. Символ '\0' в буфере рассматривается как обычный символ, а не признак конца строки.
    char *memcpy( char *dst1, char *src2, unsigned int n ); Копирует строку src2 в строку dst1, но не более чем n символов. Возвращается значение строки dst1. Реализация функции гарантирует, что перекрывающие участки будут правильно обработаны.
    Функции TURBO C и MSC (дополнительно)
    #include <string.h> Заголовочный файл для этих функций
    int memicmp(char *buf1, char *buf2, unsigned cnt ); Сравниваются не более чем cnt символов в строке buf1 со строкой buf2 в лексикографическом порядке. Возвращает: "0" - если строки совпали, "-1" - если buf1 < buf2, "1" - если buf1 > buf2. Регистр символов игнорируется. Символ '\0' в буфере рассматривается как обычный символ, а не признак конца строки.
    char *memmove(char *buf1, char *buf2, unsigned cnt ); Функция полностью идентична функции memcpy. При копировании перекрывающихся участков гарантируется, что эти участки скопируются правильно.
    char *memset( char *dest, char sim, unsigned cnt ); Функция присваивает буферу dest повторяющиеся cnt число раз значения символа sim. Возвращаемое значение - указатель на массив dest. Примечание: с помощью этой функции можно задать строку, содержащую в себе только пустые символы: '\0'. Этого невозможно сделать с помощью команды strnset.
    char *strnset( char *str1, char sim, unsigned int n ); Функция присваивает буферу str1 повторяющиеся не более чем n число раз значения символа sim. Возвращаемое значение - указатель на массив str1.
    int strnicmp(char *str1, char *str2, unsigned int n ); Сравниваются не более чем n символов в строке str1 со строкой str2 в лексикографическом порядке. Возвращает: "0" - если строки совпали, "-1" - если str1 < str2, "1" - если str1 > str2. Регистр символов игнорируется.
    char *strlwr( char *str ); Переводит все символы в строке str в нижний регистр. Возвращает значение указателя на строку str.
    char *strrev( char *str ); Функция меняет порядок следования символов в строке str. Возвращает значение указателя на строку str.
    char *strupr( char *str ); Переводит все символы в строке str в верхний регистр. Возвращает значение указателя на строку str.
    Функции TURBO C (дополнительно)
    #include <string.h> Заголовочный файл для этих функций
    char *strerror( int number );
    Язык Си. Функции ANSI C
    #include <stdio.h> Заголовочный файл для этих функций
    int sprintf( char *buffer, char *format_string[, arguments]); Функция форматирует и записывает в строку buffer сформированную строку символов, задаваемой шаблоном-строкой format_string. Обозначение метасимволов в шаблоне аналогично программе printf.
    Функции для работы с текстом
    Функция/Метод Синтаксис Описание Пример
    Perl Функции для работы со скалярами
    chomp chomp СПИСОК Удаляет из каждого строкового элемента замыкающий символ завершения записи, определенного значением переменной $/ (по умолчанию - \n). Возвращает общее количество удаленных символов. Список может состоять из одной переменной. При использовании без параметра функция эквивалентна chomp $_ .
    chop chop СПИСОК Удаляет из каждого строкового элемента списка последний символ. Возвращаемое значение - удаленный символ из последнего элемента списка. Список может состоять из одной переменной. При использовании без параметров эквивалентно вызову chop $_ .
    chr chr ЧИСЛО Возвращает символ по заданному числовому коду таблицы символов. При использовании без параметров эквивалентно вызову chr $_ .
    crypt crypt ТЕКСТ, ШИФР Шифрует ТЕКСТ с использованием заданного параметра шифра. Обратной функции дешифровки не существует.
    hex hex ВЫРАЖЕНИЕ Интерпретирует строковое ВЫРАЖЕНИЕ как шестнадцатеричное число и вычисляет его десятичный эквивалент. При использовании без параметров вызов аналогичен вызову hex $_ .
    index index СТРОКА, ПОДСТРОКА[, ПОЗИЦИЯ] Возвращает позицию первого вхождения указанной подстроки в заданную параметром СТРОКА строку или "-1", если подстрока не найдена. Если задан параметр ПОЗИЦИЯ, то поиск начинается с заданной позиции в строке (нумерация символов в строке начинается с "0").
    lc lc ВЫРАЖЕНИЕ, Функция преобразует все прописные буквы строкового параметра ВЫРАЖЕНИЕ в строчные буквы и возвращает полученную строку. В случае применения use local при преобразовании используются текущие локальные установки. При использовании без параметров функция аналогична вызову lc $_ .
    lcfirst lcfirst ВЫРАЖЕНИЕ Преобразует первый символ строкового параметра ВЫРАЖЕНИЕ в нижний регистр и возвращает полученную строку. В случае применения use local при преобразовании используются текущие локальные установки. При использовании без параметров вызов функции аналогичен вызову lcfirst $_ .
    length length ВЫРАЖЕНИЕ Возвращает количество байтов в строке, являющегося значением параметра ВЫРАЖЕНИЕ. При использовании без параметров функция эквивалентна вызову length $_ .
    oct oct ВЫРАЖЕНИЕ Интерпретирует строковое ВЫРАЖЕНИЕ как восьмеричное число и вычисляет его десятичный эквивалент. Если строка начинается с символов 0x, то его содержимое интерпретируется как шестнадцатеричное число. При использовании без параметров вызов функции аналогичен вызову oct $_ .
    ord ord ВЫРАЖЕНИЕ Возвращает числовой ASCII код первого символа строки, являющегося значением параметра ВЫРАЖЕНИЕ. При использовании без параметров вызов функции аналогичен вызову ord $_ .
    pack pack ШАБЛОН, СПИСОК Упаковывает массив или список значений в двоичную структуру в соответствии с заданным шаблоном, представляющим собой последовательность символов, которые задают порядок и тип значений. Возвращает строку, содержащую полученную структуру.
    reverse reverse СПИСОК В списковом контексте возвращает список значений, состоящий из элементов, заданным параметром СПИСОК списка, но в обратном порядке, начиная с последнего символа. В скалярном контексте соединяет все элементы списка в одну строку, состоящую из символов полученной строки, но в обратном порядке.
    rindex rindex СТРОКА, ПОДСТРОКА[, ПОЗИЦИЯ] Возвращает позицию последнего вхождения указанной подстроки в заданную параметром СТРОКА строку или "-1", если подстрока не найдена. Если задан параметр ПОЗИЦИЯ, то поиск начинается до заданной позиции в строке (включая символ в этой позиции).
    sprintf sprintf ФОРМАТ, СПИСОК Возвращает строку, представляющую собой форматный вывод списка значений, определенного параметром СПИСОК, в соответствии с заданной параметром ФОРМАТ строкой формата. Символы форматирования соответствуют функции форматирования языка Си printf.
    substr substr СТРОКА, СМЕЩЕНИЕ[, ДЛИНА[, ЗАМЕЩЕНИЕ]] Находит и возвращает из параметра СТРОКА, подстроку длиной, равной значению параметра ДЛИНА, начиная с символа, заданного параметром СМЕЩЕНИЕ. Если значение СМЕЩЕНИЕ отрицательно, то извлечение начинается с последнего символа строки. Если значение ДЛИНА отрицательно, то от конца строки отсекаются количество символов, равное абсолютному значению этого параметра. Если задан строковый параметр ЗАМЕЩЕНИЕ, то найденная подстрока замещается ею в параметре СТРОКА, который в этом случае должен быть l-Значением.
    uc uc ВЫРАЖЕНИЕ, Функция преобразует все строчные буквы строкового параметра ВЫРАЖЕНИЕ в прописные буквы и возвращает полученную строку. В случае применения use local при преобразовании используются текущие локальные установки. При использовании без параметров вызов функции аналогичен вызову uc $_ .
    ucfirst ucfirst ВЫРАЖЕНИЕ Преобразует первый символ строкового параметра ВЫРАЖЕНИЕ в верхний регистр и возвращает полученную строку. В случае применения use local при преобразовании используются текущие локальные установки. При использовании без параметров вызов функции аналогичен вызову ucfirst $_ .
    Лексикографический порядок (lexicographic ordering) совпадает с с упорядочением по алфавиту, когда строки набраны либо прописными, либо строчными буквами. Если вызываемая строка опережает документ, метод возвращает отрицательное значение, Если две сравниваемые строки равны, метод возвращает нулевое значение. Если аргумент опережает вызывающую строку, метод возвращает положительное значение.
    Perl Функции для работы со скалярами (поиск и замена фрагментов)
    pos pos СТРОКА pos Возвращает значение указателя позиции в строке после последней выполненной для нее операции поиска по образцу: m//g. Если используется в левой части операции присвоения, то изменяет значение указателя, влияя на \G в регулярном выражении. При использовании без параметров данный вызов эквивалентен вызову: pos $_.
    quotemeta quotemeta ВЫРАЖЕНИЕ quotemeta Возвращает строку, в которой перед каждым неалфавитно-цифровым символом поставлена обратная черта. Значение параметра: ВЫРАЖЕНИЕ - интерпретируется как строка. (Внутренняя функция реализации управляющего символа \0 в строках в двойных кавычках). При использовании функции без параметров эквивалентно вызову quotemeta $_.
    split split /ОБРАЗЕЦ/[.ВЫРАЖЕНИЕ[.ПРЕДЕЛ]] split Разбивает строку, являющуюся значением параметра: ВЫРАЖЕНИЕ, на массив строк, с использованием разделителя, определяемым регулярным выражением в параметре: ОБРАЗЕЦ. В списковом контексте возвращает полученный массив, в скалярном контексте - количество найденных строк разбиения. Если задан параметр: ПРЕДЕЛ, разбивает на не более чем заданное этим параметром число строк. Если параметр: ВЫРАЖЕНИЕ - не задан, то используется внутренняя специальная переменная интерпретатора Perl $_, Если не задан образец, то разбивает по пробельным символам. При использовании без параметра эквивалентна split /\s+/. $_. Операция split - антагонист операции: join.
    study study ВЫРАЖЕНИЕ study Оптимизирует строковые данные параметра: ВЫРАЖЕНИЕ - для дальнейшего использования в повторных операциях поиска по образцу. В цикле с несколькими операциями поиска может сэкономить время выполнения. При использовании без параметров функция эквивалентна: study $_.
    Perl Функции для работы с массивами скаляров
    delete delete ВЫРАЖЕНИЕ Удаляет из массива скаляров его элемент или фрагмент, заданный параметром: ВЫРАЖЕНИЕ. Если удаляется последний элемент массива, то автоматически изменяется длина массива, если удаляются элементы из его середины, то оставшиеся элементы не сдвигаются (для сдвига используйте функцию splice()), а соответствующий "удаленный" элемент принимает неопределенное значение. В списковом контексте возвращает список удаленных элементов, а в скалярном - их количество. Если удаляемых символов в массиве нет, то возвращает неопределенное значение. Функция delete работает с массивами скаляров только в Perl версий 5.6.0 и выше.
    exists exists ВЫРАЖЕНИЕ Проверяет, был ли когда-либо инициализирован в массиве скаляров элемент, заданный параметром: ВЫРАЖЕНИЕБ, например, $array[3], даже если сейчас его значение не определено. Если да, то возвращает значение "истина", иначе - "ложь". Функция exist работает с массивами скаляров только в Perl версий 5.6.0 и выше.
    pop pop МАССИВ pop Удаляет из массива скаляров последний элемент и возвращает его значение. Если массив пустой, то возвращает неопределенное значение undef. Если функция вызывается без параметров, то главной программе вызов эквивалентен pop @ARGV, а в подпрограмме pop @_.
    push push МАССИВ, СПИСОК Рассматривает массив скаляров, заданный параметром: МАССИВ, как стек и добавляет после его последнего элемента элементы списка, заданные параметром: СПИСОК. Возвращает количество элементов полученного массива.
    shift shift МАССИВ shift Удаляет из массива скаляров первый элемент и возвращает его значение. После удаления элементы оставшиеся элементы сдвигаются влево: второй элемент становится первым, третий - вторым и т.д. Если массив пустой, то возвращает неопределенное значение undef. Если функция вызывается без параметров, то главной программе вызов эквивалентен shift @ARGV, а в подпрограмме shift @_.
    splice splice МАССИВ, НОМЕР[, КОЛИЧЕСТВО[, СПИСОК]] Удаляет из массива количество элементов, заданное значением параметра: КОЛИЧЕСТВО, начиная с элемента, заданное значением параметра: НОМЕР. В случае задания параметра СПИСОК заменяет указанные в нем элементы списка. В списковом контексте возвращает удаленные элементы; в скалярном контексте - последний удаленный элемент. Если параметр:КОЛИЧЕСТВО не задан, то удаляются все элементы после элемента с номером, определенным значением параметра: НОМЕР.
    unshift unshift МАССИВ, СПИСОК Добавляет элементы списка, определенного параметром: СПИСОК, в начало массива, заданного параметром МАССИВ. Выполняет действия, противоположные действиям функции shift.
    grep grep БЛОК СПИСОК grep ВЫРАЖЕНИЕ, СПИСОК
    join join ВЫРАЖЕНИЕ, СПИСОК Рассматривает все элементы списка, определенного параметром: СПИСОК, как строковые значения, соединяет их в одну строку, вставляя между ними разделитель, равный значению параметра: ВЫРАЖЕНИЕ, и возвращает полученную строку.
    map map БЛОК СПИСОК map ВЫРАЖЕНИЕ, СПИСОК
    pack pack ВЫРАЖЕНИЕ, СПИСОК
    reverse reverse СПИСОК В списковом контексте возвращает список значений элементов, заданный параметром: СПИСОК, в обратном порядке, начиная с последнего элемента. В скалярном контексте соединяет все элементы в одну строку и возвращает строку, в которой символы расположены в обратном порядке, начиная с последнего символа.
    sort sort [ПОДПРОГРАММА] СПИСОК sort [БЛОК] СПИСОК Сортирует список значений, заданный в параметре: СПИСОК. Если параметры БЛОК и ПОДПРОГРАММА не заданы, то используется стандартная процедура сравнения строковых данных. Если они заданы, то операторы блока или подпрограммы используются в качестве процедуры сравнения при сортировке элементов списка. В этом случае в теле блока или подпрограммы в последнем операторе следует использовать операцию <=> или cmp в зависимости от сортировки соответственно числовых и строковых данных. Возвращает список, элементами которого являются отсортированные элементы исходного списка.
    unpack unpack ШАБЛОН, ВЫРАЖЕНИЕ
    Страницы:

    7.1. Структуры, объединения и перечисления

    Одним из преимуществ "новых" языков программирования (таких как "Паскаль", "Си") является появление "пользовательских" типов данных. В языке Си к таким данным относят структуры, объединения и перечисления. Рассмотрим их поподробнее.

    Структура

    Структура представляет собой несколько типов данных, расположенных вместе, в соседних ячейках памяти. Структура имеет собственное имя как тип данных, длина ее элемента (в памяти компьютера) вычисляется с помощью функции sizeof (в C и C++). Пример структуры следующий:

    [Пример 01]

    /* Инициализируем константу */
    
    const unsigned short MAXSTRINGLENGTH = 256;
    
    /* Описание структуры stringz */
    
    struct stringz
    {
    	char string[MAXSTRINGLENGTH];
    	short nLength;
    }

    Здесь определена структура с именем stringz, содержащая в себе массив string длиной MAXSTRINGLENGTH (в нашем случае - это 256 символов), и целым числом длиной 2 байта nLength, в котором может, например, храниться реальная длина строки.

    Объединение

    Объединение похоже на структуру, но в ней данные хранятся не вместе друг с другом, а вместо друг друга. Например, в следующем объединении с тегом data:

    [Пример 02]

    /* Объявление константы
    
    const unsigned short STRDATALENGTH = 32:
    
    /* Объявление объединения
    
    union data{
    	long intdata;
    	double doubledata;
    	char strdata[STRDATALENGTH];
    }

    Может храниться либо длинное целое, либо данные с плавающей точкой, либо массив-строка символов длиной 32 байта, причем все - в одних и тех же ячейках памяти. Функция sizeof, примененная к объединению, выдает значение самого длинного типа данных в объединении.

    Обращение к элементам структуры и объединения осуществляется либо через знак "." (для переменной), либо знаком "->" (для указателей). Например:

    [Пример 03]

    /* Инициализируем константу */
    
    const unsigned short MAXSTRINGLENGTH = 256;
    
    /* Объявление переменных */
    
    struct stringz aString, *theString;
    union data aData, *theData;
    
    /* Присвоение значений переменным */
    
    aString.nLength = 5;
    memset(theString -> string, '\0', MAXSTRINGLENGTH);
    
    aData.intdata = 1;
    theData -> doubledata = 7.0;

    Перечисления

    Перечисления иногда называют именованными типами данных. Их объявление на языке Си следующее:

    enum <тег> {<константа 0>, <константа 1>, ... <константа n>};

    Например:

    [Пример 04]

    /* определяет булевский тип данных */
    
    enum boolean {FALSE, TRUE}

    Переменные типа "перечисление" представляют собой целые переменные без знака, способные принимать значения только из списка: <константа 0> ... <константа n>, причем первой константе соответствует значение "0".

    Переменную перечисления в Си можно привести к целому типу. Обратное действие вызывает неопределенность.

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

    Замечание. Некоторые языки не поддерживают структуры. Тогда их можно эмулировать следующим образом:

    [Пример 05]

    stringZ$ = "Привет!"
    stringZ% = 7

    В этом примере вместо структуры stringz в языке Quick Basic используются переменные stringZ$ (для хранения символьных данных) и stringZ% для хранения целого числа.

    7.2. Составные специальные типы

    К составным специальным символьным типам данных автор относит такие типы данных, как класс "string" из библиотеки ClassLib в Borland C/C++, класс "String" стандартной библиотеки языка Java, класс "CString" в библиотеке MFC из пакета Microsoft Visual Studio и т.д. Эти классы частично заменяют такой примитивный символьный тип данных, как массив скаляров char[]. В стандартах на языки C++ и Sun Java 2 наличие таких предопределенных классов является обязательным. В таблице [[C_Tables.xls]07.I.] представлены стандартные методы классов "string" в Borland C/C++, "String" в Sun Java 2, "CString" в Microsoft MFC 2.0 и функции работы с символьными данными в Visual Basic Script.

    Замечание: классы "String" в Sun Java 2 и "CString" в MFC 2.0 представляют символы только в кодировке Unicode.

    В примерах [06 - 08] дается реализация алгоритмов Примера 01 лекции 6 с помощью классов "CString", "String" и "string" соответственно.

    Замечание: к примеру 06. Несмотря на то, что класс "CString" содержит в себе данные в кодировке Unicode, текст для них пишется в 8-ми битной кодировке. Поэтому для перевода текста в кодировку Unicode используется функция: _T(...). В компиляторе Java 2 нет специальной функции для перевода 8-ми битных кодировок в Unicode.

    [Пример 06]

    // Определение переменной: <имярек>.
    CString strImyaRek("Света");
    // Определение переменной-результата.
    Cstring strResult();
    // Символьные вычисления.
    strResult = _T("Привет ") + strImyaRek + _T("! С добрым утром.");

    [Пример 07]

    // Определение переменной: <имярек>.
    string strImyaRek("Света");
    // Определение переменной-результата.
    string strResult();
    // Символьные вычисления.
    strResult.append("Привет ");
    strResult += strImyaRek;
    strResult.append("! С добрым утром.");

    [Пример 08]

    // Определение переменной: <имярек>.
    String strImyaRek("Света");
    // Определение временных переменных
    strPrivet("Привет ");
    strEnd("! С добрым утром.");
    // Определение переменной-результата.
    Cstring strResult();
    // Символьные вычисления.
    strResult = strPrivet + strImyaRek + strEnd;

    Подробнее о символьных типах данных смотри следующую литературу:

  • примитивные символьные типы языка Си [31];
  • пример класса String, определенного в C++ [51];
  • диск с учебниками по программированию;
  • класс String в Java 2 [74];
  • класс CString в MFC 2.0 [Он-лайн руководство по Microsoft Visual C/C++];
  • класс string в ClassLib [Он-лайн руководство по Borland C/C++ 5.01];
  • описание языка Perl [59].
  • Замечания, касающиеся "взлома" программ

    Реализацию собственных символьных классов следует производить с осторожностью. Если класс закрыт от изменений, но при этом он возвращает свои защищенные значения, то хакер может получить ссылку на этот объект, и, изменяя содержимое этой ссылки, фактически он меняет содержимое этого защищенного элемента класса. Более подробно об этой проблеме смотри примеры в книге [74].

    Также к составным специальным символьным типам относят все переменные Perl. Подробнее о типах языках Perl см. лекцию 8.

    7.3. Массивы и указатели

    В разделах 6.2 и 7.1 уже использовалось понятие массива, правда, применительно только к примитивным символьным данным. Но массив, в принципе, может состоять из любых данных, в том числе и числовых, и типов-классов и структур, а также из других массивов. Массивы представляют собой смежные ячейки памяти, начиная с начального адреса массива и до последней ячейки памяти массива. Доступ к каждой ячейке памяти осуществляется по его индексу. С помощью индекса вычисляется адрес нужной ячейки по формуле:

    <адрес элемента> = <начальный адрес массива>+<индекс>*<длина типа данных>
    Примечание: формула 7.2 верна для тех языков, нумерация массивов для которых начинается с нулевого элемента. В языках Бейсик, ФОРТРАН и др. нумерация массива начинается с первого элемента, и первый множитель заменяется на (<индекс>-1).

    Индекс массива может меняться от 0 до N-1 или от 1 до N, где N - максимальный размер массива. Синтаксис объявления массива следующий:

    <тип> <переменная>[<N>]

    для языков Си, С++, Java, где N - максимальное число ячеек в массиве;

    DIM <переменная с типом>(<N>)

    для языка Бейсик

    [Пример 09]

    REM - определяет массив строк A$ из 10 переменных и матрицу вещественных чисел D размером 3х3;
    
    DIM A$(10), D(3,3)

    [Пример 10]

    /* - определяет массив строк A из 10 переменных и матрицу вещественных чисел d размером 3х3,
    а также массив примитивных символов array из десяти символов и указатель на символьный массив, которому можно назначить адрес имеющегося массива. */
    
    string A[10];
    double d[3][3];
    char *c, array[10];

    Индекс массива

    Для выбора одного из элементов массива используется его индекс. Индекс - порядковый номер элемента массива в отведенной для него области памяти. Операция нахождения значения ячейки массива по его индексу называется индексированием. Индексом может быть как целое число, так и целая переменная.

    [Пример 11]

    /* Задание типов элементам */
    
    char b, c, str[5];
    int i;
    
    ...
    
    /* Присвоение элементов: */
    
    c = str[5]; b = str[i];

    В приведенном примере символьным переменным b и c присваивается соответственно значение i -ой и третьей ячейки массива символьных данных str.

    Замечание. При определении класса операцию индексирования можно переопределять (иначе говоря, перегрузить). О перегрузке операций сказано в книге [51].

    Максимальный индекс массива определяется следующими способами:

  • Явное указание максимальных индексов целыми константами:

    [Пример 12]

    const short MAXNUMBER = 8;
    
    char str[7];
    short nIndexes[MAXNUMBER];
  • Определение элементов массива по количеству заранее предопределенных для него значений:

    [Пример 13]

    char str[] = "Привет!";
    short nIndexes[] = {5, 4, 6, 8, 7, 3, 1, 2};
  • Как видно, при определении индексов этим способом квадратные скобки остаются пустыми.

    Указатели

    Кроме массивов, для обращения к переменной по ее адресу можно пользоваться указателем на переменную указанного типа. Указатели есть в языках Си, C++ и Java, но отсутствует во многих "старых" языках, таких как ФОРТРАН и Quick Basic.

    Синтаксис определения указателя следующий:

    <тип> *<имя переменной>

    Замечание. Как уже отмечалось в примере 10, массивы можно определить как указатели. Однако это нужно делать в следующих случаях:

  • При передаче массива как параметра функции;
  • Для создания динамических массивов, то есть массивов, размещенных в памяти ЭВМ с помощью функций new, calloc, malloc и других функций выделения памяти. После окончания использования массива память следует освободить функциями delete, free и др.
  • После определения указателя, например, после объявления:

    char *c, a, d='a';

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

    c = (char *) malloc( sizeof( char ) );

    или присвоить ей адрес существующей ячейки памяти:

    c = d;

    Для того чтобы получить значение ячейки памяти, после присвоения адреса по формуле 7.8, можно использовать следующий оператор:

    a = *c;

    В этом случае переменной a будет присвоено значение 'a', а после присвоения:

    *c = 'b';

    переменной d будет присвоено значение 'b'

    Замечание. Не следует присваивать указателю - адресной переменной значение какой-либо другой переменной, отличной от ее адреса. В этом случае генерируется ошибка компилятора:
    c = a; (компилятор выдаст ошибку!)
    Замечание. При присвоении указателя необходимо обязательно указывать его тип. В этом (и только в этом) случае компилятор корректно обрабатывает код программы, вычисляет размер ячейки памяти и т.п. Если по логике программы необходимо изменить тип указателя, делайте эту операцию явно, например:

    [Пример 14]

    /* Описание переменных */
    
    char *c, d='a';
    unsigned char *u;
    
    /* Присвоение указателей */
    
    c = d;
    u = (unsigned char *)c;

    В результате в переменной u хранится содержимое ячейки d "как есть". Переменная c будет по-прежнему иметь тип char * (указатель на тип char).

    В некоторых функциях используется указатель на "пустой" тип: void *. Перед использованием этого указателя необходимо присвоить (переопределить) его на указатель на необходимый тип данных.

    [Пример 15]

    /* Определение переменных */
    
    char *c;
    
    /* Присвоение указателей: */
    
    c = (char *) malloc( sizeof( char ) );

    Чтобы присвоить переменной-указателю адрес выделенной ячейки памяти, необходимо явно изменить тип возвращаемого значения функции malloc (по-умолчанию функция malloc возвращает тип: "void *").

    Ссылки

    Ссылка - это "разыменованный" указатель. Она обозначается как <тип> <переменная>. В основном она применяется в параметрах функции. Пусть, например, объявлена функция:

    void func( int a, int *b, int c);

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

    Второй параметр передает в качестве фактического параметра указатель на переменную. Если теперь "разыменовать" этот указатель, то значение переменной, на которую указывает указатель, может меняться, но адрес переменной после окончания функции потеряет все сделанные изменения.

    Наконец, третий параметр функции сочетает в себе достоинства обоих способов передачи параметров. Так, ссылку, как и переменную, передаваемую "по значению", не надо разыменовывать. Однако, после выхода из функции, новое значение предаваемой "по ссылке" переменной сохраняется. Поэтому вызов функции func, определенное в [7.12], будет следующим:

    func( i, i, i );

    где i - целая переменная - "фактический параметр".

    Замечание. Передача данных "по ссылке" является потенциально опасной с точки зрения "безопасности" хранения и изменения данных. Поэтому не злоупотребляйте ее использованием!

    7.4. Списки

    Списки представляют собой примерно такую же последовательность данных, как и массивы. Они отличаются друг от друга следующим образом:

  • У списков нет индекса, а значит обращение к его любому значению напрямую невозможно:
  • Получить доступ можно только к его первому элементу (голове списка), а ко всем последующим - только через метод next() ;
  • Элементы (узлы) списка могут размещаться в любых ячейках памяти, а не только подряд. Почему - см. следующий пункт;
  • Тип "список" может быть реализован, например, следующим образом:

    [Пример 16]

    struct list_node{
    	union data datum_node;
    	struct list_node *next_node;
    }
    где data - объединение из примера 02. Этот элемент, в принципе, может иметь любой тип: как примитивный, так и определенный тип-класс. Второй элемент, имеющий тип: struct list_node * (указатель на собственный тип), является обязательным. В этом указателе находится либо адрес следующего элемента списка-узла ("node" по-английски - "звено, узел"), или нулевой указатель (обозначение - NULL), если это последний элемент списка. Поскольку указатель (адрес звена) может принимать любое значение, то расположение звеньев в памяти может быть любым;
  • Размер списка, в принципе, может быть любым.
  • С первого взгляда кажется, что использование списка, по сравнению с массивом, неудобно. Но это неудобство происходит только при работе с "императивными" алгоритмами, для которых существует только одна, основная последовательность в реализации алгоритма. Однако существуют также и "декларативные" алгоритмы, в которых задаются (описываются) только исходные данные, цель задачи, а алгоритм нахождения цели "встроен" в реализации языка и скрыт от программиста. На "декларативных" алгоритмах основана функциональная парадигма программирования (язык LISP) и логическая парадигма программирования (язык PROLOG). В этих языках вполне естественно (из логики построения программы) заменить произвольный доступ к элементам массива на доступ к "голове" (начальному элементу) и "хвосту" (остальной части) списка. Более подробно о языке Turbo Prolog смотри [files/prolog.zip] материалы по языку: "Турбо Prolog".

    7.5. Резюме

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

    Среди пользовательских типов данных Вы познакомились со структурами и объединениями. Специальные же типы "отметились" массивами и указателями на тип данных. Хотя в примерах рассматривались в основном "машинные" типы данных, в языках программирования можно использовать массивы и указатели на любые символьные данные, в том числе можно создавать массивы указателей и массивы пользовательских данных.

    Автор особо хотел бы остановить внимание на другом специальном типе данных - списке. Хотя списки практически не встречаются в "процедурных" языках программирования (их реализация имеется только в библиотеке ClassLib Borland C/C++), они очень широко используются при анализе текстов, грамматическом разборе приложениях, и других алгоритмах искусственного интеллекта. Поэтому автор советует изучить этот тип данных самостоятельно.

    7.6. Глоссарий

    Термин Английский термин Разъяснение
    специальный символьный тип данных special symbol data type Символьный тип данных, реализованный в виде классов. К специальным символьным типам данных относят классы: "string" из библиотеки ClassLib Borland C/C++, "CString" из библиотеки MFC Microsoft Visual C/C++, стандартный класс языка Java - "String" и др. Как правило, текст внутри переменных такого типа не меняется!
    массив array Представляет собой смежные ячейки памяти, начиная с начального адреса массива, и до последней ячейки памяти массива. Доступ к каждой ячейке памяти массива осуществляется при помощи его индекса.
    индекс index Порядковый номер ячейки массива. В Си-подобных языках индекс первой ячейки начинается с 0.
    Си подобные языки C based languages Языки программирования, имеющие синтаксис и обозначения, сходные с принятыми обозначениями в языке Си. К Си-подобным языкам автор относит: C++, C#, Java, Perl, Python, C--, JScript и др.
    структура structure Представляет собой несколько типов данных, расположенных вместе, в соседних ячейках памяти. Структура как тип данных имеет собственное имя, длина ее элемента вычисляется с помощью функции: sizeof.
    объединение union Представляет собой несколько типов данных, расположенных в одной ячейке памяти вместо друг друга. Объединение имеет собственное имя как тип данных.
    перечисления enumerate Представляет собой целые переменные без знака, способные принимать значения только именованных констант, причем первой константе присваивается значение 0.
    пользовательский тип данных users' data type Тип данных, созданный системным или прикладным программистам для собственных нужд. К пользовательским типам данных на языке Си относят классы, структуры, объединения и перечисления.
    именованный тип данных denominate data type Целый тип данных, значения (константы) для которых записаны как имена (идентификаторы). Это позволяет использовать в различных операциях вместо безликого числа некоторого "осмысленного имени", что улучшает "читабельность" программы. На языке Си именованные константы вводятся оператором enum или прагма оператором #define.
    константа constant Число или символьная строка, не меняющаяся во время исполнения программ. Именованная константа - переменная с неизменным значением. Константа имеет определенный тип данных.
    переменная variable Идентификатор, обозначающий ячейку памяти для хранения данных со значением определенного типа. Этот идентификатор называется именем переменной.
    идентификатор identification Любая последовательность латинских букв и цифр, начинающаяся с латинской буквы. Идентификаторы служат именами констант и переменных.
    модификатор modification Идентификатор, служащий для уточнения и/или изменения значения по-умолчанию для указателей, типов данных и т.п.
    целая константа integer constant Переменная (идентификатор), имеющее постоянное неизменное целое значение. В языке Си эти константы объявляются либо прагма оператором #define, либо оператором const int.
    явное указание максимальных индексов strict direction of ultimate index Указание максимального значения индекса массива в процессе его создания или объявления без инициализации. Если массив указан как последовательность типов данных, то это значение изменить нельзя без удаления и повторного создания массива.
    неявное указание максимального индекса implicit direction of ultimate index Указание максимального индекса массива при его объявлении с инициализацией. Это значение определяется количеством констант (символов) в строке, которой инициализируется массив. При неявном указании максимального значения индекса его значение изменить уже нельзя!
    указатель 1. pointer 1. Целая переменная, хранящая адрес переменной или константы заданного типа. В Си-подобных языках обозначения массива и указателя эквивалентны.
    указатель 2. pointer 2. Целая переменная, хранящая в себе адрес другой переменной (или массива) указанного типа. В языке Си указателем является специальный тип - "адресная переменная" того типа данных, на которое указывает указатель. Это делает невозможным (так надо!) применения целочисленных операций над указателями.
    NULL-указатель NULL 1. См. пустой (нулевой) указатель. Используется в языке Си.
    пустой (нулевой) указатель empty (zero) pointer Указатель, принимающий нулевое целое значение. При попытке обращения к "пустому" указателю генерируется отказ системы ("NULL pointer assigned). Это значение указателя используется в специальных целях.
    ссылка link "Разыменованный" указатель, которой в операции присвоения используется как переменная, а в параметрах функции - как адрес этой переменной. Ссылки следует использовать с осторожностью!
    список list Структура данных, представляющее собой "значение" и ссылку на следующий элемент списка. Обратиться к элементу списка можно через голову списка и многократному применению методов next.
    голова списка head of the list Адрес первого элемента списка.
    хвост списка tail of the list Все элементы списка, расположенные после текущего элемента. Хвост списка может быть пустым.
    метод next next (method) Ищет адрес следующего элемента списка. Возвращает значение: NULL, если текущий элемент списка - последний.
    NULL NULL 2. "Нулевой символ" при адресации памяти. При обращении программы по этому адресу выводится сообщение: "NULL pointer assigned", и программа перестает выполняться.

    7.7. Приложение

    В таблицах 7.1 - 7.7 Дан список основных функций работы с символьными данными.

    Символьные типы данных
    Тип данных Префикс/Окончание Разрядность регистров/длина Примечание
    Quick Basic
    STR <идентификатор>$ Переменная длина (до 255 символов) Для хранения 1 символа в кодировке ASCII. Не защищен от изменений.
    VB Script
    Variant в зависимости от конкретного значения Переменная длина Используется для хранения всех видов данных.
    Java
    char с 2 байта Для хранения одного символа в кодировке Unicode
    String str Переменная длина Класс для хранения символов в кодировке Unicode. Защищено от изменений!
    javascript
    variant в зависимости от конкретного значения Переменная длина Используется для хранения всех видов данных.
    C/C++
    char с 1 байт Для хранения одного символа в кодировке ASCII (со знаком)
    unsigned char uc 1 байт Для хранения одного символа в кодировке ASCII (без знака)
    char * pc от 2 до 4 байт Указатель на массив (переменной длины)
    unsigned char * puc от 2 до 4 байт Указатель на массив (переменной длины)
    C/C++ Windows API
    BYTE b 1 байт Эквивалентен unsigned char
    NPSTR npsz 2 байта Эквивалентен char near *
    LPSTR lpch 4 байта Эквивалентен char far *
    LPCSTR lpsz 4 байта Эквивалентен const char far *
    C++ MFC
    CString cstr, str Переменная длина Класс для хранения символов в кодировке Unicode. Защищено от изменений!
    C++ Classlib
    string str Переменная длина Класс для хранения символов в кодировке ASCII (и Unicode?). Защищено от изменений!
    Функции для работы с текстом
    Группа функций Функция/Метод Описание Пример
    Язык С++. Функции MFC для Microsoft Visual Studio
    Конструктор CString Конструктор объекта CString различными способами.
    Строка как массив GetLength Возвращает число символов в строке.
    IsEmpty Проверяет, является ли строка пустой (т.е. она состоит из 0 символов).
    Empty Удаляет из строки все символы.
    GetAt Возвращает символ в текущей позиции.
    operator [] Функция аналогична функции: GetAt
    SetAt Записывает символ в указанную позицию.
    operator LPCTSTR Прямой доступ к символам текущей строки в формате языка Си.
    Присвоение и конкатенация operator = Назначает новое значение строки объекту.
    operator + Операция конкатенации двух строк.
    operator += Операция конкатенации второй строки к концу первой.
    Сравнение operator == <, etc. Операторы сравнения (чувствительные к регистру).
    Compare Сравнение двух строк (чувствительное к регистру).
    CompareNoCase Сравнение двух строк (без учета регистра).
    Извлечение Mid Выделяет среднюю часть строки (как функция MID$ в Бейсике).
    Left Выделяет левую часть строки (как функция LEFT$ в Бейсике).
    Right Выделяет правую часть строки (как функция Бейсика RIGHT$).
    SpanIncluding Выделяет подстроку, которая содержит только символы из данного множества;
    SpanExcluding Выделяет подстроку, которая содержит символы, не входящие в указанное множество.
    Другие преобразования MakeUpper Преобразует все символы в строке в верхний регистр.
    MakeLower Преобразует все символы в строке в нижний регистр.
    MakeReverse Изменяет порядок символов в строке на обратный порядок следования символов.
    Format Форматирует строку в соответствии со спецификацией sprintf.
    TrimLeft Обрезает "лидирующие", начальные пробелы в строке.
    TrimRight Обрезает "хвостовые" пробелы в строке.
    FormatMessage Форматирует строку сообщения.
    Поиск Find Ищет символ или подстроку внутри текущей строки.
    ReverseFind Ищет символ или подстроку внутри текущей строки, начиная с ее конца.
    FindOneOf Finds the first matching character from a set.
    Архивация/Дамп operator << Помещает строку в выходной поток данных.
    operator >> Читает строку из входного потока данных.
    Buffer Access Функции манипуляции с буфером
    GetBuffer Возвращает указатель на символы из строки.
    GetBufferSetLength Возвращает указатель на символы из строки CString, урезанную по указанной длине.
    ReleaseBuffer Удаляет буфер для хранения строки данных.
    FreeExtra Удаляет все заголовки этого строкового объекта, предварительно размещенного во внешней памяти,
    LockBuffer Делает ссылку на строку активной (т.е. к размещенной строке командой GetBuffer, можно обращаться).
    UnlockBuffer Делает ссылку на строку не активной, разрешая операционной системе произвольно перемещать буфер в памяти.
    Специфичные для Windows AllocSysString Размещает BSTR из данных CString
    SetSysString Устанавливает текущий BSTR объект данными из CString объекта.
    LoadString Загрузить существующую строку из ресурсов Windows.
    AnsiToOem Преобразует строку символов из формата ANSI в OEM в соответствии с заданными национальными настройками.
    OemToAnsi Преобразует строку символов из формата OEM в формат ANSI в соответствии с национальными настройками операционной системы.
    Функции для работы с текстом
    Функция/Метод Синтаксис Описание Пример
    Язык С++. Функции ClassLib Borland C/C++
    Header File cstring.h
    Конструкторы: string::string
    Данные - члены класса: StripType
    Публичные методы:
    ansi_to_oem void ansi_to_oem(); перевод текста строки из кодировки ANSI в кодировку OEM (согласно установленному национальному стандарту)
    append string _FAR append( const string _FAR s );

    string _FAR append( const string _FAR s, size_t start, size_t n = NPOS );

    string _FAR append( const char _FAR *cp, size_t start, size_t n = NPOS );
    добавляет заданную строку s к текущей строке.
    assign string _FAR assign( const string _FAR s );

    string _FAR assign( const string _FAR s, size_t start, size_t n = NPOS );

    compare int compare(const string _FAR s) const throw();

    int compare(const string _FAR s, size_t orig, size_t n = NPOS ) const throw();

    строка s сравнивается с исходной строкой в лексикографическом порядке, и выдается значение: меньше нуля, если исходная строка меньше s, 0, когда строки равны и больше нуля, когда исходная строка больше s.
    contains int contains(const char _FAR * pat) const;

    int contains(const string _FAR s) const;

    проверяется вхождение строки s (или pat) в текущую строку. Возвращает 1 если строка входит в текущую строку, и 0, если не входит.
    copy size_t copy( char _FAR *cb, size_t n = NPOS );

    size_t copy( char _FAR *cb, size_t n, size_t pos );

    string copy() const throw( xalloc ).;
    функция копирует n символов в строку cb из текущей строки. Возвращает точное число скопированных символов. В третьей форме синтаксиса функция возвращает собственную копию;
    c_str const char _FAR *c_str() const;
    find size_t find( const string _FAR s );

    size_t find( const string _FAR s, size_t pos );

    Возвращает позицию первого вхождения подстроки s в текущую строку.
    find size_t find( const TRegexp _FAR pat, size_t i = 0 );

    size_t find( const TRegexp _FAR pat, size_t _FAR *ext, size_t i = 0 ) const;

    Возвращает позицию первого вхождения подстроки с шаблоном регулярного выражения pat в текущую строку, начиная с позиции i. Число i сообщает длину строки, совпадшей с шаблоном.
    find_first_of size_t find_first_of( const string _FAR s ) const;

    size_t find_first_of( const string _FAR s, size_t pos ) const;

    возвращает первый символ из текущей строки, совпавший с любым символом из строки s.
    find_first_not_of size_t find_first_not_of( const string _FAR s ) const;

    size_t find_first_not_of( const string _FAR s, size_t pos ) const;

    find_last_of size_t find_last_of( const string _FAR s ) const;

    size_t find_last_of( const string _FAR s, size_t pos ) const;

    find_last_not_of size_t find_last_not_of( const string _FAR s ) const;

    size_t find_last_not_of( const string _FAR s, size_t pos ) const;

    get_at char get_at( size_t pos ) const throw( outofrange ); возвращает символ в указанной позиции pos.
    get_case_sensitiveFlag static int get_case_sensitive_flag(); Возвращает значение 0, если сравнение чувствительно к регистру букв.
    get_initial_capacity static unsigned get_initial_capacity();
    get_max_waste static unsigned get_max_waste();
    get_paranoid_check static int get_paranoid_check();
    get_resize_increment
    static unsigned get_resize_increment();
    get_skipwhitespace_flag static int get_skipwhitespace_flag(); возвращает 1, если при поиске пропускаются пробельные символы.
    hash unsigned hash() const; Выдает значение хеш величины типа данных;
    initial_capacity static size_t initial_capacity(size_t ic = 63);
    insert string _FAR insert( size_t start, const string _FAR s );

    string _FAR insert( size_t pos, const string _FAR s, size_t start, size_t n = NPOS );

    Вставляет pos символов из строки s в текущую строку, начиная с позиции start.
    is_null int is_null() const; Возвращает 1, если строка пустая;
    length unsigned length() const; возвращает длину текущей строки.
    MaxWaste static size_t MaxWaste(size_t mw = 63); задает максимальное число пробельных символов и расширяет строку.
    oem_to_ansi void oem_to_ansi(); функция преобразует строку из кодировки oem в кодировку ANSI согласно указанным региональным стандартам.
    prepend string _FAR prepend( const string _FAR s );

    string _FAR prepend( const string _FAR s, size_t start, size_t n = NPOS );

    string _FAR prepend( const char _FAR *cp );

    string _FAR prepend( const char _FAR *cp, size_t start, size_t n = NPOS );

    Функция прибавляет к началу текущей строки строку s, начиная с позиции start.
    put_at void put_at( size_t pos, char c ) throw( outofrange ); записывает в позицию pos символ c.
    read_file istream _FAR read_file(istream _FAR is); читает файл из входящего потока в строку;
    read_line istream _FAR read_line(istream _FAR is); читает строку файла из указанного потока в строку, пока не достигнут знак "перевод строки" или "конец файла".
    read_string istream _FAR read_string(istream _FAR is); читает строку файла из указанного потока в строку, пока не достигнут знак "\0" или "конец файла".
    read_to_delim istream _FAR read_to_delim(istream _FAR is, char delim = '\n'); читает строку файла из указанного потока в строку, пока не достигнут знак delim или "конец файла".
    read_token istream _FAR read_token(istream _FAR is); читает строку файла из указанного потока в строку, пока не достигнут пробельный символ или "конец файла". Пустые строки в начале файла игнорируются.
    rfind size_t rfind( const string _FAR s );

    size_t rfind( const string _FAR s, size_t pos );

    возвращает последний символ из текущей строки, совпавший с любым символом из строки s.
    remove string _FAR remove( size_t pos );

    string _FAR remove( size_t pos, size_t n = NPOS );

    удаляет часть текущей строки (длиной n или до конца строки), начиная с позиции pos.
    replace string _FAR replace( size_t pos, size_t n = NPOS, const string _FAR s );

    string _FAR replace( size_t pos, size_t n1, const string _FAR s, size_t start, size_t n2 );

    удаляет, по крайней мере, n (n1) позиций из текущей строки, начиная с позиции pos, и заменяет ее, по крайней мере, n2 позициями строки s, начиная с позиции start (или всей строкой s).
    reserve size_t reserve() const;

    void reserve( size_t ic );

    resize void resize(size_t m); увеличивает длину строки на m байт.
    resize_increment static size_t resize_increment(size_t ri = 64); устанавливает инкремент для автоматического изменения длины строки в ri байт.
    set_case_sensitive static int set_case_sensitive(int tf = 1); устанавливает чувствительность к регистру символов при сравнении строк: 1 - чувствительный к регистру, 0 - не чувствительный.
    set_paranoid_check static int set_paranoid_check(int ck = 1);
    skip_whitespace static int skip_whitespace(int sk = 1); Устанавливается в единицу, чтобы пропускать пробельные символы при чтении слов (цепочек), или 0 в противном случае;
    strip TSubString strip( StripType s = Trailing, char c=' '); удалят из текущей строки все пробельные или заполняющие с символы вначале, в конце строки или в обоих направлениях, и выдается ссылка на результирующую строку типа TSubString.
    substr string substr( size_t pos ) const;

    string substr( size_t pos, size_t n = NPOS ) const;

    возвращает подстроку из текущей строки, начинающейся с позиции pos текущей строки.
    substring TSubString substring( const char _FAR *cp );

    const TSubString substring( const char _FAR *cp ) const;

    TSubString substring( const char _FAR *cp, size_t start );

    const TSubString substring( const char _FAR *cp, size_t start ) const;

    создает объект типа TSubstring, содержащей копию строки cp.
    to_lower void to_lower(); переводит строку в нижний регистр;
    to_upper void to_upper(); переводит символы строки в верхний регистр.
    Protected Member Functions
    valid_element int valid_element( size_t pos ) const; возвращает 1, если в позиции pos находится элемент строки, и 0 в противном случае.
    valid_index int valid_index( size_t pos ) const; возвращает 1, если pos нормальный индекс строки символов, и 0 в противном случае.
    assert_element
    assert_index
    cow
    Operators =; +=; +=; +; []; (); ==; !=; <; <=; >; >=;
    Related Global Operators and Functions >>; <<; +; getline; to_lower; to_upper;
    Функции для работы с текстом
    Функция/Метод Описание Пример
    Java. Методы класса String
    charAt(Позиция) Возвращает символ строки, стоящий в заданной позиции. Позиции отсчитываются с 0.
    compareTo( Любая_строка) Сравнивает вызывающий строковый фрагмент и строковый аргумент на предмет первенства в лексикографическом порядкеЛексикографический порядок (lexicographic ordering) совпадает с с упорядочением по алфавиту, когда строки набраны либо прописными, либо строчными буквами. Если вызываемая строка опережает документ, метод возвращает отрицательное значение, Если две сравниваемые строки равны, метод возвращает нулевое значение. Если аргумент опережает вызывающую строку, метод возвращает положительное значение. String entry = "adventure".

    Выражение: entry.compareTo("zoo") возвращает отрицательное число.

    Выражение: entry.compareTo("adventure") выдаст 0.

    Выражение: entry.compareTo("above") выдаст положительное число.

    equals(Другая_строка) Возвращает true, если вызывающий объект является строкой и равен объекту Другая_строка. В противном случае возвращает false.
    equalsIgnoreCase (Другая_строка) Возвращает true, если вызывающий объект является строкой и равен объекту Другая_строка без учета регистра букв. В противном случае возвращает false.
    indexOf( Любая_строка) Возвращает позицию первого вхождения строки: Любая_строка в строковом объекте. Позиция отсчитывается с 0. Возвращает "-1", если Любая_строка не найдена.
    indexOf( Любая_строка, Начало) Возвращает позицию первого вхождения строки: Любая_строка в строковом объекте, после позиции Начало. Позиция отсчитывается с 0. Возвращает "-1", если Любая_строка не найдена.
    lastIndexOf( Любая_строка) Возвращает позицию последнего вхождения строки: Любая_строка в строковом объекте. Позиция отсчитывается с 0. Возвращает "-1", если Любая_строка не найдена.
    length() Возвращает длину строкового фрагмента. String strgreeting = "Привет!". Выражение: Strgreeting.length() возвращает 7.
    substring(Начало) Возвращает подстроку строкового фрагмента, начинающегося с позиции Начало и оканчивающегося концевым символом строки. Позиции отсчитываются от 0.
    substring(Начало, Конец) Возвращает подстроку строкового фрагмента, начинающегося с позиции Начало и оканчивающегося позицией Конец. Позиции отсчитываются от 0.
    toLowerCase() Возвращает исходную строку символов, все символы у которой - строчные.
    toUpperCase() Возвращает исходную строку символов, все символы у которой - прописные.
    trim() Удаляет в возвращаемой строке ведущие и концевые пробелы.
    Функции для работы с текстом
    Функция/Метод Описание Пример
    VB Script функции
    Asc Функция возвращает ASCII код символа или первого символа в строке. Asc("A") - возвращает 65, а Asc("Russia") - 82.
    Chr Эта функция возвращает ASCII символ по ASCII коду. Chr(65) - возвращает "A".
    Instr Функция используется для получения местоположения одной строки в другой. Функция имеет следующий синтаксис: Instr([Begin_Pos], Str1, Str2, [ComparisionType]), - где Begin_Pos - необязательный элемент, задающий начальную позицию поиска, Str1 - строка, в которой происходит поиск, Str2 - исходная строка, ComparisionType - способ сравнения: 0 - бинарное сравнение (по умолчанию), 1 - сравнение с игнорированием регистра букв.
    LCase Возвращает исходную строку символов, все символы у которой - строчные.
    Left Функция возвращает определенное число символов из строки. Выражение: Left("VBScript for Internet", 8) - возвращает "VBScript".
    Len Функция возвращает число символов в строке. Len("Привет!") - выдает число 7.
    LTrim Функция удаляет предшествующие пробелы из строки.
    Mid Возвращает определенное число символов из строки. Выражение: Mid("VBScript for Internet", 0. 8) - возвращает "VBScript".
    Right Функция возвращает определенное число символов с правой стороны строки. Right("VBScript", 6) - возвращает "Script"
    RTrim Функция удаляет последующие пробелы из строки.
    Str Эта функция преобразует цифровое выражение в строку.
    StrComp Эта функция используется для сравнения двух строк в лексикографическом порядкеЛексикографический порядок (lexicographic ordering) совпадает с с упорядочением по алфавиту, когда строки набраны либо прописными, либо строчными буквами. Если вызываемая строка опережает документ, метод возвращает отрицательное значение, Если две сравниваемые строки равны, метод возвращает нулевое значение. Если аргумент опережает вызывающую строку, метод возвращает положительное значение. , и имеет синтаксис: StrComp( Str1, Str2, CompMeth), - где CompMeth - метод сравнения: 0 - бинарное, 1 - игнорирование регистра символов. Если Str1 равно Str2, то значение - "0", если Str1 < Str2, то значение - "-1", если Str1 > Str2, то значение - "1".
    String Функция предназначена для заполнения строки определенным числом символов. String(10, "A") - вернет строку "AAAAAAAAAA".
    Trim Функция удаляет и предшествующие, и последующие пробелы из строки.
    UCase Возвращает исходную строку символов, все символы у которой - прописные.
    Функции для работы с текстом
    Функция/Метод Описание Пример
    Язык Си. Функции ANSI C
    #include <string.h> Заголовочный файл для этих функций
    int strlen( char *str ); Возвращает длину строки str1 (позицию его символа \0).
    char* strerror( char *str );
    char *strncat( char *str1, char *str2, unsigned int n ); Конкатенация строки str1 и str2, но в строку n записывается не более n символов. Возвращается значение строки str1 или NULL при неудаче конкатенации.
    int strncmp( char *str1, char *str2, unsigned int n ); Сравниваются не более чем n символов в строке str1 со строкой str2 в лексикографическом порядке. Возвращает: "0" - если строки совпали, "-1" - если str1 < str2, "1" - если str1 > str2.
    char *strncpy( char *str1, char *str2, unsigned int n ); Копирует строку str2 в строку str1, но не более чем n символов. Возвращается значение строки str1 или NULL при неудаче копирования.
    char *strpbrk( char *str1, char *str2 ); Ищется первое вхождение символа из строки str2 в строке str1. Возвращает указатель на этот символ или NULL, если символы не обнаружены.
    char *strrchr( char *str1, char *str2 ); Ищется последнее вхождение символа из строки str2 в строке str1. Возвращает указатель на этот символ или NULL, если символы не обнаружены.
    char *strspn( char *str1, char *str2 ); Ищется первое вхождение символа, которого нет в строке str2, в строке str1. Возвращает указатель на этот символ или NULL, если символы не обнаружены.
    char *strstr( char *str1, char *str2 ); Ищется первое вхождение подстроки str2 в строке str1. Возвращается указатель на заданную подстроку или NULL в случае ее необнаружения.
    char *strtok( char *str1; char *str2 ); Функция разбивает строку str1 на слова, вставляя после каждого из них символ '\0'. Символы, являющиеся разделителями слов, перечислены в строке str2. При первом вызове функция возвращает указатель на str1. При последующем вызове (с параметром str1 == NULL) она возвращает указатели на другие слова в строке str1. Функция возвращает NULL, если все слова закончились.
    char *memchr( char *buf, char sim, unsigned cnt ); Функция ведет поиск первого вхождения символа sim в не более чем cnt символов с начала строки buf. Возвращает указатель на символ sim в случае его нахождения или NULL если он не найден.
    int memcmp( char *buf1, char *buf2, unsigned cnt ); Сравниваются не более чем cnt символов в строке buf1 со строкой buf2 в лексикографическом порядке. Возвращает: "0" - если строки совпали, "-1" - если buf1 < buf2, "1" - если buf1 > buf2. Символ '\0' в буфере рассматривается как обычный символ, а не признак конца строки.
    char *memcpy( char *dst1, char *src2, unsigned int n ); Копирует строку src2 в строку dst1, но не более чем n символов. Возвращается значение строки dst1. Реализация функции гарантирует, что перекрывающие участки будут правильно обработаны.
    Функции TURBO C и MSC (дополнительно)
    #include <string.h> Заголовочный файл для этих функций
    int memicmp(char *buf1, char *buf2, unsigned cnt ); Сравниваются не более чем cnt символов в строке buf1 со строкой buf2 в лексикографическом порядке. Возвращает: "0" - если строки совпали, "-1" - если buf1 < buf2, "1" - если buf1 > buf2. Регистр символов игнорируется. Символ '\0' в буфере рассматривается как обычный символ, а не признак конца строки.
    char *memmove(char *buf1, char *buf2, unsigned cnt ); Функция полностью идентична функции memcpy. При копировании перекрывающихся участков гарантируется, что эти участки скопируются правильно.
    char *memset( char *dest, char sim, unsigned cnt ); Функция присваивает буферу dest повторяющиеся cnt число раз значения символа sim. Возвращаемое значение - указатель на массив dest. Примечание: с помощью этой функции можно задать строку, содержащую в себе только пустые символы: '\0'. Этого невозможно сделать с помощью команды strnset.
    char *strnset( char *str1, char sim, unsigned int n ); Функция присваивает буферу str1 повторяющиеся не более чем n число раз значения символа sim. Возвращаемое значение - указатель на массив str1.
    int strnicmp(char *str1, char *str2, unsigned int n ); Сравниваются не более чем n символов в строке str1 со строкой str2 в лексикографическом порядке. Возвращает: "0" - если строки совпали, "-1" - если str1 < str2, "1" - если str1 > str2. Регистр символов игнорируется.
    char *strlwr( char *str ); Переводит все символы в строке str в нижний регистр. Возвращает значение указателя на строку str.
    char *strrev( char *str ); Функция меняет порядок следования символов в строке str. Возвращает значение указателя на строку str.
    char *strupr( char *str ); Переводит все символы в строке str в верхний регистр. Возвращает значение указателя на строку str.
    Функции TURBO C (дополнительно)
    #include <string.h> Заголовочный файл для этих функций
    char *strerror( int number );
    Язык Си. Функции ANSI C
    #include <stdio.h> Заголовочный файл для этих функций
    int sprintf( char *buffer, char *format_string[, arguments]); Функция форматирует и записывает в строку buffer сформированную строку символов, задаваемой шаблоном-строкой format_string. Обозначение метасимволов в шаблоне аналогично программе printf.
    Функции для работы с текстом
    Функция/Метод Синтаксис Описание Пример
    Perl Функции для работы со скалярами
    chomp chomp СПИСОК Удаляет из каждого строкового элемента замыкающий символ завершения записи, определенного значением переменной $/ (по умолчанию - \n). Возвращает общее количество удаленных символов. Список может состоять из одной переменной. При использовании без параметра функция эквивалентна chomp $_ .
    chop chop СПИСОК Удаляет из каждого строкового элемента списка последний символ. Возвращаемое значение - удаленный символ из последнего элемента списка. Список может состоять из одной переменной. При использовании без параметров эквивалентно вызову chop $_ .
    chr chr ЧИСЛО Возвращает символ по заданному числовому коду таблицы символов. При использовании без параметров эквивалентно вызову chr $_ .
    crypt crypt ТЕКСТ, ШИФР Шифрует ТЕКСТ с использованием заданного параметра шифра. Обратной функции дешифровки не существует.
    hex hex ВЫРАЖЕНИЕ Интерпретирует строковое ВЫРАЖЕНИЕ как шестнадцатеричное число и вычисляет его десятичный эквивалент. При использовании без параметров вызов аналогичен вызову hex $_ .
    index index СТРОКА, ПОДСТРОКА[, ПОЗИЦИЯ] Возвращает позицию первого вхождения указанной подстроки в заданную параметром СТРОКА строку или "-1", если подстрока не найдена. Если задан параметр ПОЗИЦИЯ, то поиск начинается с заданной позиции в строке (нумерация символов в строке начинается с "0").
    lc lc ВЫРАЖЕНИЕ, Функция преобразует все прописные буквы строкового параметра ВЫРАЖЕНИЕ в строчные буквы и возвращает полученную строку. В случае применения use local при преобразовании используются текущие локальные установки. При использовании без параметров функция аналогична вызову lc $_ .
    lcfirst lcfirst ВЫРАЖЕНИЕ Преобразует первый символ строкового параметра ВЫРАЖЕНИЕ в нижний регистр и возвращает полученную строку. В случае применения use local при преобразовании используются текущие локальные установки. При использовании без параметров вызов функции аналогичен вызову lcfirst $_ .
    length length ВЫРАЖЕНИЕ Возвращает количество байтов в строке, являющегося значением параметра ВЫРАЖЕНИЕ. При использовании без параметров функция эквивалентна вызову length $_ .
    oct oct ВЫРАЖЕНИЕ Интерпретирует строковое ВЫРАЖЕНИЕ как восьмеричное число и вычисляет его десятичный эквивалент. Если строка начинается с символов 0x, то его содержимое интерпретируется как шестнадцатеричное число. При использовании без параметров вызов функции аналогичен вызову oct $_ .
    ord ord ВЫРАЖЕНИЕ Возвращает числовой ASCII код первого символа строки, являющегося значением параметра ВЫРАЖЕНИЕ. При использовании без параметров вызов функции аналогичен вызову ord $_ .
    pack pack ШАБЛОН, СПИСОК Упаковывает массив или список значений в двоичную структуру в соответствии с заданным шаблоном, представляющим собой последовательность символов, которые задают порядок и тип значений. Возвращает строку, содержащую полученную структуру.
    reverse reverse СПИСОК В списковом контексте возвращает список значений, состоящий из элементов, заданным параметром СПИСОК списка, но в обратном порядке, начиная с последнего символа. В скалярном контексте соединяет все элементы списка в одну строку, состоящую из символов полученной строки, но в обратном порядке.
    rindex rindex СТРОКА, ПОДСТРОКА[, ПОЗИЦИЯ] Возвращает позицию последнего вхождения указанной подстроки в заданную параметром СТРОКА строку или "-1", если подстрока не найдена. Если задан параметр ПОЗИЦИЯ, то поиск начинается до заданной позиции в строке (включая символ в этой позиции).
    sprintf sprintf ФОРМАТ, СПИСОК Возвращает строку, представляющую собой форматный вывод списка значений, определенного параметром СПИСОК, в соответствии с заданной параметром ФОРМАТ строкой формата. Символы форматирования соответствуют функции форматирования языка Си printf.
    substr substr СТРОКА, СМЕЩЕНИЕ[, ДЛИНА[, ЗАМЕЩЕНИЕ]] Находит и возвращает из параметра СТРОКА, подстроку длиной, равной значению параметра ДЛИНА, начиная с символа, заданного параметром СМЕЩЕНИЕ. Если значение СМЕЩЕНИЕ отрицательно, то извлечение начинается с последнего символа строки. Если значение ДЛИНА отрицательно, то от конца строки отсекаются количество символов, равное абсолютному значению этого параметра. Если задан строковый параметр ЗАМЕЩЕНИЕ, то найденная подстрока замещается ею в параметре СТРОКА, который в этом случае должен быть l-Значением.
    uc uc ВЫРАЖЕНИЕ, Функция преобразует все строчные буквы строкового параметра ВЫРАЖЕНИЕ в прописные буквы и возвращает полученную строку. В случае применения use local при преобразовании используются текущие локальные установки. При использовании без параметров вызов функции аналогичен вызову uc $_ .
    ucfirst ucfirst ВЫРАЖЕНИЕ Преобразует первый символ строкового параметра ВЫРАЖЕНИЕ в верхний регистр и возвращает полученную строку. В случае применения use local при преобразовании используются текущие локальные установки. При использовании без параметров вызов функции аналогичен вызову ucfirst $_ .
    Лексикографический порядок (lexicographic ordering) совпадает с с упорядочением по алфавиту, когда строки набраны либо прописными, либо строчными буквами. Если вызываемая строка опережает документ, метод возвращает отрицательное значение, Если две сравниваемые строки равны, метод возвращает нулевое значение. Если аргумент опережает вызывающую строку, метод возвращает положительное значение.
    Perl Функции для работы со скалярами (поиск и замена фрагментов)
    pos pos СТРОКА pos Возвращает значение указателя позиции в строке после последней выполненной для нее операции поиска по образцу: m//g. Если используется в левой части операции присвоения, то изменяет значение указателя, влияя на \G в регулярном выражении. При использовании без параметров данный вызов эквивалентен вызову: pos $_.
    quotemeta quotemeta ВЫРАЖЕНИЕ quotemeta Возвращает строку, в которой перед каждым неалфавитно-цифровым символом поставлена обратная черта. Значение параметра: ВЫРАЖЕНИЕ - интерпретируется как строка. (Внутренняя функция реализации управляющего символа \0 в строках в двойных кавычках). При использовании функции без параметров эквивалентно вызову quotemeta $_.
    split split /ОБРАЗЕЦ/[.ВЫРАЖЕНИЕ[.ПРЕДЕЛ]] split Разбивает строку, являющуюся значением параметра: ВЫРАЖЕНИЕ, на массив строк, с использованием разделителя, определяемым регулярным выражением в параметре: ОБРАЗЕЦ. В списковом контексте возвращает полученный массив, в скалярном контексте - количество найденных строк разбиения. Если задан параметр: ПРЕДЕЛ, разбивает на не более чем заданное этим параметром число строк. Если параметр: ВЫРАЖЕНИЕ - не задан, то используется внутренняя специальная переменная интерпретатора Perl $_, Если не задан образец, то разбивает по пробельным символам. При использовании без параметра эквивалентна split /\s+/. $_. Операция split - антагонист операции: join.
    study study ВЫРАЖЕНИЕ study Оптимизирует строковые данные параметра: ВЫРАЖЕНИЕ - для дальнейшего использования в повторных операциях поиска по образцу. В цикле с несколькими операциями поиска может сэкономить время выполнения. При использовании без параметров функция эквивалентна: study $_.
    Perl Функции для работы с массивами скаляров
    delete delete ВЫРАЖЕНИЕ Удаляет из массива скаляров его элемент или фрагмент, заданный параметром: ВЫРАЖЕНИЕ. Если удаляется последний элемент массива, то автоматически изменяется длина массива, если удаляются элементы из его середины, то оставшиеся элементы не сдвигаются (для сдвига используйте функцию splice()), а соответствующий "удаленный" элемент принимает неопределенное значение. В списковом контексте возвращает список удаленных элементов, а в скалярном - их количество. Если удаляемых символов в массиве нет, то возвращает неопределенное значение. Функция delete работает с массивами скаляров только в Perl версий 5.6.0 и выше.
    exists exists ВЫРАЖЕНИЕ Проверяет, был ли когда-либо инициализирован в массиве скаляров элемент, заданный параметром: ВЫРАЖЕНИЕБ, например, $array[3], даже если сейчас его значение не определено. Если да, то возвращает значение "истина", иначе - "ложь". Функция exist работает с массивами скаляров только в Perl версий 5.6.0 и выше.
    pop pop МАССИВ pop Удаляет из массива скаляров последний элемент и возвращает его значение. Если массив пустой, то возвращает неопределенное значение undef. Если функция вызывается без параметров, то главной программе вызов эквивалентен pop @ARGV, а в подпрограмме pop @_.
    push push МАССИВ, СПИСОК Рассматривает массив скаляров, заданный параметром: МАССИВ, как стек и добавляет после его последнего элемента элементы списка, заданные параметром: СПИСОК. Возвращает количество элементов полученного массива.
    shift shift МАССИВ shift Удаляет из массива скаляров первый элемент и возвращает его значение. После удаления элементы оставшиеся элементы сдвигаются влево: второй элемент становится первым, третий - вторым и т.д. Если массив пустой, то возвращает неопределенное значение undef. Если функция вызывается без параметров, то главной программе вызов эквивалентен shift @ARGV, а в подпрограмме shift @_.
    splice splice МАССИВ, НОМЕР[, КОЛИЧЕСТВО[, СПИСОК]] Удаляет из массива количество элементов, заданное значением параметра: КОЛИЧЕСТВО, начиная с элемента, заданное значением параметра: НОМЕР. В случае задания параметра СПИСОК заменяет указанные в нем элементы списка. В списковом контексте возвращает удаленные элементы; в скалярном контексте - последний удаленный элемент. Если параметр:КОЛИЧЕСТВО не задан, то удаляются все элементы после элемента с номером, определенным значением параметра: НОМЕР.
    unshift unshift МАССИВ, СПИСОК Добавляет элементы списка, определенного параметром: СПИСОК, в начало массива, заданного параметром МАССИВ. Выполняет действия, противоположные действиям функции shift.
    grep grep БЛОК СПИСОК grep ВЫРАЖЕНИЕ, СПИСОК
    join join ВЫРАЖЕНИЕ, СПИСОК Рассматривает все элементы списка, определенного параметром: СПИСОК, как строковые значения, соединяет их в одну строку, вставляя между ними разделитель, равный значению параметра: ВЫРАЖЕНИЕ, и возвращает полученную строку.
    map map БЛОК СПИСОК map ВЫРАЖЕНИЕ, СПИСОК
    pack pack ВЫРАЖЕНИЕ, СПИСОК
    reverse reverse СПИСОК В списковом контексте возвращает список значений элементов, заданный параметром: СПИСОК, в обратном порядке, начиная с последнего элемента. В скалярном контексте соединяет все элементы в одну строку и возвращает строку, в которой символы расположены в обратном порядке, начиная с последнего символа.
    sort sort [ПОДПРОГРАММА] СПИСОК sort [БЛОК] СПИСОК Сортирует список значений, заданный в параметре: СПИСОК. Если параметры БЛОК и ПОДПРОГРАММА не заданы, то используется стандартная процедура сравнения строковых данных. Если они заданы, то операторы блока или подпрограммы используются в качестве процедуры сравнения при сортировке элементов списка. В этом случае в теле блока или подпрограммы в последнем операторе следует использовать операцию <=> или cmp в зависимости от сортировки соответственно числовых и строковых данных. Возвращает список, элементами которого являются отсортированные элементы исходного списка.
    unpack unpack ШАБЛОН, ВЫРАЖЕНИЕ
    Вернуться к учебному плану