Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
математическая логика и теория алгоритмов.doc
Скачиваний:
118
Добавлен:
10.05.2014
Размер:
2.32 Mб
Скачать
          1. 1. Функция сцепления двух строк

Результатом данной функции является строка, в начале которой размещены символы первой строки, а за ними – символы второй строки. При реализации данной функции возникает вопрос о том, где будет размещена результирующая строка. Возможны два способа реализации операции:

а) функция формирует новую строку. Память для результирующей строки может выделяться вне функции и передаваться ей с помощью соответствующего аргумента или внутри функции, и тогда функция в качестве своего результата возвращает значение указателя на выделенную память;

б) функция модифицирует первую строку, добавляя в ее конец символы второй строки. В этом случае память, выделенная для первой строки, должна иметь достаточный размер для формирования результата. Такой подход применен в библиотечной функции сцепления строк strcat(). Эта функция в качестве результата возвращает указатель на первый символ результирующей (т.е. первой) строки.

Рассмотрим возможный способ реализации библиотечной функции сцепления строк. Текст функции приводится ниже и в файле stringv.cpp.

char * concat(char *first, char *second)

{

char *tmp;

/* вычислим значение указателя на последний символ (нуль-байт) первой строки;

* в дальнейшем он будет заменен первым символом второй строки.

*/

for(tmp = first; *tmp; tmp ++)

;

/* добавление символов второй строки в конец первой; как только будет скопирован

* нуль-байт, цикл завершится. Полученная строка также будет нуль ограниченной.

*/

while(*tmp ++ = *second ++)

;

return first;

}

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

          1. 2. Функция поэлементного сравнения двух строк

Строки представляют собой символьные нуль ограниченные строки; результат сравнения:

0, если строки одинаковые,

< 0, если первая строка "меньше" второй (в лексикографическом смысле, т.е. первый несовпадающий символ первой строки предшествует в алфавитном порядке соответствующему символу второй строки);

> 0, если первая строка "больше" второй в лексикографическом смысле.

Текст функции приводится ниже и в файле stringv.cpp.

int compare(char *first, char *second)

{

while(*first == * second && *first)

first ++, second ++;

return *first - *second;

}

Доступ к элементам строки, представленной вектором, осуществляется при помощи указателей.

В заголовке цикла записано выражение, обеспечивающее выполнение цикла, пока строки равны (символы строк совпадают) и еще не закончились. В теле цикла в выражении использованы операция «запятая», что позволило записать только один оператор и поэтому не использовать фигурные скобки (для обозначения составного оператора; эквивалентной записью было бы {first ++; second ++;}).

Цикл завершится, если нарушается хотя бы одно из двух условий:

  • найдены несовпадающие символы (*first != *second); это означает, что строки не равны, и результат функции определяется как разность между кодами двух не совпавших символов;

  • символы строк совпадают (*first == *second) и равны нулю (*first == 0, а, следовательно, и*second == 0); следовательно, результатом функции будет 0.