Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
тюмгу / Лекции КБ ИБАС 1 курс 2 семестр / лекция1 Безопасность 2018.ppt
Скачиваний:
19
Добавлен:
08.12.2019
Размер:
1.35 Mб
Скачать

Операции со строками Массивы символов в C++

Для представления символьных строк в C++ не существует специального строкового типа. Вместо этого строки в C++ представляются как массивы элементов типа char, заканчивающиеся терминатором строки – символом с нулевым значением ’\0’. Строки, заканчивающиеся нуль-терминатором, часто называют ASCIIZ-строками. Символьные строки состоят из

набора символьных констант, заключенного в двойные кавычки:

“Это строка символов...”

При объявлении строкового массива необходимо принимать во внимание наличие терминатора в конце строки, отводя тем самым под строку на один байт больше:

1

Массивы символов в C++

Строковый массив может при объявлении инициализироваться начальным значением. При этом компилятор автоматически вычисляет размер будущей строки и добавляет в конец нуль- терминатор:

He следует путать нуль (0) и нулевой байт (\0), или нулевой символ. Признаком конца строки является именно нулевой байт. Если не указать обратную косую черту, нуль будет считаться обычным символом.

2

Ввод строк

Функция gets() считывает строку символов, введенных с клавиатуры, и размещает их по адресу, указанному в аргументе. Символы на клавиатуре набираются до тех пор пока не будет нажата клавиша Enter. В конец строки ставится не символ перехода на новую строку, а нулевой байт. После этого функция gets() завершает свою работу.

Прототип функции gets() имеет следующий вид:

char *gets(char *строка)

Здесь параметр строка представляет собой массив, в который записываются символы, введенные пользователем.

3

Ввод строк

Пример: считать строку в массив str и вывести его длину

При работе с функцией gets () следует проявлять осторожность, поскольку она не проверяет выход индекса массива за пределы допустимого диапазона. Следовательно, количество символов, введенных пользователем, может превысить длину массива.

4

Ввод строк

Функция getline ( ) осуществляет потоковую запись вводимых

символов и контролирует количество введенных символов. Синтаксис функции getline ( ) имеет вид:

istream& getline ( char* pch , int nCount , char delim = ’\n’ ) ;

Функция getline ( ) принимает два обязательных параметра:

pch указывает на строку, в которую осуществляется ввод,

nCount – число символов, подлежащих вводу.

Третий необязательный параметр delim – символ, который будет преобразован в нуль-терминатор. По умолчанию это символ конца строки ’\n’.

5

Вывод строк

Функция puts () выводит на экран строку символов и переводит

курсор на следующую строку экрана. Ее прототип: int puts (const char *строка)

Функция puts(), как и функция printf(), распознает эскейп

последовательности например '\n', предназначенную для перехода на новую строку. На вызов функции puts() тратится меньше ресурсов, чем на функцию printf(), поскольку она может выводить

лишь строки, но не числа. Кроме того, она не форматирует вывод.

6

Функции для работы со строками Длина строки

Для работы со строками используются функции описанные в модуле string.h. Длина строки:

strlen ( const char* string ) ;

7

Копирование строк

Значения строк нельзя копировать с помощью оператора присваивания.

Необходимо иметь в виду, что идентификаторы S и C являются указателями. Поэтому после выполнения оператора S = C идентификаторы S и C указывают на одну и ту же область памяти.

8

Копирование строк

Функция strcpy ( ) имеет прототип:

char* strcpy ( char* str1 , const char* str2 ) ;

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

Например, следующий фрагмент копирует в строку S значение строки "String copy":

9

Копирование части строки. Функция strncpy

Функция strncpy ( ) отличается от strcpy ( ) тем, что в ее параметрах добавляется еще один аргумент, указывающий количество символов,

не больше которого будет скопировано. Ее синтаксис имеет вид: char* strncpy ( char* str1 , const char* str2 , size_t num ) ;

Если длина str1 меньше длины str2, происходит урезание символов:

10

Копирование строки с выделением памяти. Функция strdup

Функция strdup ( ) в качестве параметра получает указатель на строку-источник, осуществляет распределение памяти, копирует в отведенную область строку и возвращает указатель на начало

полученной строки-копии. Синтаксис функции следующий: char* strdup ( const char* source ) ;

11

Присоединение строки Функция strсat

Функция strсat ( ) имеет синтаксис:

char* strcat ( char* str1 , const char* str2 ) ;

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

Вследующем примере строка S инициализируется с помощью

функции копирования strcpy ( ) и дополняется подстрокой, используя функцию strcat ( ):