По теме лабораторной работы

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

Как и в ANSIС, для представления символьных строк в C++ не существует специального строкового типа. Вместо этого строки в C++ представляются как массивы элементов типа char заканчивающиеся терминатором строки - символом с нулевым значением (' \0 ')• Строки, заканчивающиеся нуль - терминатором, часто называют ASCIIZ-строками. Символьные строки состоят из набора символьных констант, заключенного в двойные кавычки:

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

В таблице 1 приведен набор констант, применяющихся в C++ в качестве символов.

Таблица 1 - Классификация символов

прописная буква от 'А' до 'Z',OT 'А' до 'Я'
строчная буква от ' а ' до ' z ' , от ' а ' до ' я '
цифра от ' 0 ' до ' 9 '
пустое место горизонтальная табуляция ' \9 ' , перевод строки (код ASCII 10), вертикальная табуляция (код ASCII 11), перевод формы (код ASCII 12), возврат каретки (код ASCII 13)
символы пунктуации !"#$%&' ()*,-./:;<=>?@[\]^_'{|}~
управляющий символ все символы с кодами от 0 до 1Fh включительно и символ с кодом 7Fh
пробел символ пробела (код ASCII 32)
     

 

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

// Объявление строки размером 10 символов,

// включая терминатор. Реальный размер

// строки: 9 символов + 1 терминатор char buffer[10];

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

// Объявление и инициализация строки:

char Wednesday[] = "Среда";

// что равносильно:

char Wednesday[] =

{'С',’р',’е','д','а’,'\0'};

В качестве оператора ввода при работе со строками вместо оператора записи в поток » лучше использовать функцию get-line(), так как потоковый оператор ввода игнорирует вводимые пробелы, а кроме того, может продолжить ввод элементов за пределами массива, если под строку отводится меньше места, чем вводится символов. Функция getline () принимает два пара­метра: первый аргумент указывает на строку, в которую осуществляется ввод, а второй - число символов, подлежащих вводу.

Рассмотрим пример объявления символьных строк и использования функции ввода getline ( ).

#include <iostream.h>

int main()

{

char myString[4];

cout « "Введите строку: " « '\n';

cin.getline(myString, 4);

cout « "Вы ввели: " « myString;

return 0;

}

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

Большинство функций работы со строками содержится в библиотеке string.h. Основные функции работы с символьными массивами сведены в таблицу 2.

Таблица 2.

Функции работы со строками символов

Наименование Краткое описание
strcpy копирует строку2 в строку1
strcat присоединяет строку2 в конец строки1
strchr возвращает позицию первого вхождения сим­вола в строку
strcmp сравнивает строку1 со строкой2, различая про­писные и строчные буквы
strcmpi см. stricmp
strcpy копирует строку2 в строку1
strcspn возвращает позицию первого вхождения сим­вола из заданного набора символов
strdup распределяет память и делает копию строки

Пример 1.: Поиск строки

Следующий пример показывает использование функции strstr().

char strl[]="Производится поиск элемента";

char str2[] = "поиск";

char* ptr;

ptr=strstr(strl, str2);

cout << ptr << ‘\n’;

Пример 2Предположим, необходимо разбить имеющееся в строковом массиве предложение по словам и вывести каждое из них на экран.

#include <string.h>

#include <iostream.h>

int main()

{

char str[] = "язык программирования C++";

char *Delimiters = " - !?,;:\"'/0123456789

<@#$o-%^&*()<>{}[]’~+- = ";

char *ptr;

ptr = strtok(str, Delimiters);

if(ptr)

cout << ptr << ‘\n';

while(ptr)

{

ptr = strtok(NULL, Delimiters);

if(ptr)

cout << ptr << '\n’;

}

return 0 ; }

Задания для лабораторной работы:

1. Определить самое длинное слово в тексте. Разделители между словами- символы точка, запятая, точка с запятой, пробел. Между двумя словами может быть несколько разделительных символов.

2. Написать функцию вставки подстроки в строку.

3. Написать функцию сравнения двух строк.

4. Написать функцию поиска подстроки в строке.

5. Написать функцию, которая проверяет, есть ли в полученной ею в качестве параметра строке точка и пробел перед каждой заглавной буквой, кроме первой (алфавит латинский). Если нет, то функция вставляет их.

6. Напишисать функцию, которая вставляет пробел после каждой точки в строку, полученную ей в виде параметра.

7. Ввести произвольный текст. Найти среднюю длину слов в нем.

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

9. Предложите два варианта функции, удаляющей из строки ведущие и концевые пробелы.

 

Контрольные вопросы:

1.Какой размер одномерного символьного массива должен быть объявлен для записи в него строки из 5 символов?

2.Как организуются многомерные символьные массивы ?

3. Как организуется индексирование символьных массивов?

4. На кого или на что возлагается контроль границ символьных массивов?

5.Как следует объявить символьный массив для записи в него трех строк различной длины?

6.Как следует организовать посимвольное заполнение одномерного массива?

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

8.Какие функции используются для считывания с консоли символьных массивов?

9.Для каких функций включаются в программу заголовочные файлы ctype.h и string.h?