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

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

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

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

Рассмотрим возможный способ реализации библиотечной функции сцепления строк (текст функции приводится ниже и в файле Programs/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, если первая строка "больше" второй в лексикографическом смысле.

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

int compare(char *first, char *second)

{

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

first++, second++;

return *first - *second;

}

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

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

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

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

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

Соседние файлы в папке docs