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

Лабораторная работа № 10

Работа со строками в С++

Строка в С++ - это массив символов, оканчивающийся нулевым символом ('\0') .

Таким образом, можно определить строки двумя способами: как массив символов или как указатель на первый символ строки, например:

char str1[10] = "string1"; // объявление строки с помощью массива символов

Вы уже знаете, что массив - это набор однородных значений. Так вот строка есть не что иное, как набор символов, и, соответственно, для хранения строк можно использовать символьные массивы. Например, строка "QWERTY" имет тип char[7], а пустая строка "" имеет тип char[1]. Почему char[1]? Именно потому, что любая строка завершается так называемым нулевым символом, то есть символом, код которого в ASCII-таблице равен 0 (этот символ также является escape-символом и его символьный эквивалент представляется как '\0'). Благодаря этому свойству Вы всегда можете определить конец строки, если у Вас строка занимает меньшее количество символов, чем то количество, которое было указано в квадратных скобках при оъявлении массива, т.е. определить фактическую длину строки, хранящейся в массиве.

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

Объявление char str[] = "ABCDE";присваивает переменной-строке начальное значение "ABCDE". А точнее, создает массив из 6 символов: 'A','B','C','D','E' и символа '\0'.

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

Сразу необходимо отметить, что С++ сам автоматически сделает последний элемент массива нулевым символом (а Вы уже помните, что любая строка обязательно заканчивается нулевым символом), то есть, хотя в данном случае Вы массиву str присваиваете строку "ABCDE", длина которой составляет 5 символов, C++ выделяет память под 6 символов, записывает туда строку и затем в последний (пятый при счете от 0) записывает нулевой символ.

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

Объявление char str[10] = "ABCDE";создает массив из 10 символов и первые пять элементов этого массива принимают значения 'A','B','C','D' и 'E' соответственно, остальные символы будут ноль-символы.

В данном случае в первые 5 элементов массива записывается строка "ABCDE", а всем остальным элементам присваиваются нули.

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

char str[]={'A','B','C','D','E','\0'};

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

Типичная ошибка программирования.Не выделяется достаточно места в массиве символов для хранения нулевого символа, завершающего строку.

Типичная ошибка программирования.Создание или использование "строки", которая не содержит завершающего нулевого символа.

Типичная ошибка программирования.Путают символьные и строковые константы.

Символьная константа - это один символ, заключенный в апострофы, например: 'A' или '\n'. Строковая константа - это последовательность символов, заключенная в двойные кавычки.

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

cin >> Имя_массива;

и, аналогичным образом, вывести сразу всю строку на экран, используя оператор вывода

cout << Имя_массива;

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

Например,

#include <iostream.h>void main(){ char str[31]; // объявление символьного массива cout<<"Enter a string (max 30 symbols):"; cin>>str; // ввод строки cout<<"\nYou enter string:"<<str; // вывод строки}

Как видите в данном примере выделяется память под 31 символ, но пользователю в приглашении указывается, что он может ввести строку с размером максимум 30 символов, учитывая тот факт, что оператор cin добавит еще один нулевой символ в конец строки автоматически, и под него также необходимо предусмотреть выделение памяти. Далее после приглашения вводим сразу всю строку с клавиатуры в массив и затем с соответствующим сообщением выводим всю строку на экран монитора.

Второй способ определения строки - это использование указателя на символ. Объявление

char *b;

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

#include<iostream.h> void main(){ char str[] = "Здравствуй, мир!"; // объявляем символьный массив char *b; // объявляем указатель на символ b = &str[12]; // теперь b указывает на 12-ый символ str *b = 'M'; // присваиваем первому элементу b символ 'М' cout << b; // выводим строку b на экран (Мир!)}

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

В этом разделе мы познакомимся с некоторыми типичными функциями стандартной библиотеки string.h. Это библиотека обработки строк, которая обеспечивает много полезных функций для работы со строковыми данными, например, сравнение строк, поиск в строках символов и других подстрок, разметку строк (разделение строк на логические куски) и определение длины строки.

  1. Функция int strlen (const char* s); - определяет длину строки s. Возвращает количество символов, предшествующих завершающему нулевому символу. Обратите внимание, завершающий ноль-символ в длину не включается. Например,
  2. Функция char *strcpy(char *s1, const char *s2);- копирует строку s2 в массив символов s1. Возвращает значение s1. Массив символов s1 должен быть достаточно большим, чтобы хранить строку и ее завершающий нулевой символ, который также копируется. Например,

Обратите внимание, если Вы хотите, чтобы одна строка содержала другую, Вы должны скопировать ее содержимое, а не присвоить! Так, например, в данном случае инструкция ps = "QWERTY" была бы ошибочна. Компилятор, встречая такую инструкцию, создают строку "QWERTY", за которой следует нулевой символ и присваивает значение начального адреса этой строки (адреса символа Q) переменной ps. Таким образом, теряется исходное значение ps, а значит невозможно корректно освободить память под ps.

3. Функция int *strcmp(const char *s1, const char *s2);- сравнивает строки s1 и s2 (по ASCII-кодам). Функция возвращает значение 0, если строки s1 и s2 равны, значение меньше ноля, если строка s1 меньше s2, и значение больше ноля, если s1 больше s2. Обратите внимание, строки сравниваются не по длине, а посимвольно, по ASCII-кодам ( т.е. "g" больше "ffФункция char *strcat(char *s1, const char *s2); - добавляет строку s2 к строке s1. Первый символ строки s2 записывается поверх ноль-символа строки s1. Возвращает s1. Под s1 должно быть выделено памяти не меньше чем (strlen(s1)+strlen(s2)+1
  1. Функция char *strncpy(char *s1, const char *s2, int n); - копирует не болеее n символов строки s2 в массив символов s1. Возвращает s1.
  2. Функция char *strncmp(char *s1, const char *s2, int n); - сравнивает до n символов строки s1 со строкой s2. Возвращает 0, меньше, чем 0 или больше, чем 0, если s1 соответственно равн, меньше или больше s2.
  3. Функция char *strncat(char *s1, const char *s2, int n); - присоединяет первые n символов строки s2 в строку s1. Возвращает s1.
Функция char *strchr(const char *s, int c); - проверяет строку s на содержание символа хранящегося в c. Результатом функции является адрес первого вхождения символа c в строку s. Если символ не найден, возващается NULL. Функция char *strstr(const char *s1, const char *s2); - проверяет строку s1 на содержание подстроки s2. Результатом функции является адрес первого вхождения подстроки s2 в строку s1. Если подстрока не найдена, возващается NULLФункция char *strlwr(char *s); - конвертирует строку к нижнему регистру (т.е. переводит строку в строчные символы).
  1. Функция char *strupr(char *s); - конвертирует строку к верхнему регистру (т.е. переводит строку в прописные символы).
Функция char *strset(char *s, int ch); - заменяет ВСЕ символы в строке s на символ ch.
  1. Функция char *strnset(char *s, int ch, int n); - заменяет первые n символов в строке s на символ ch.
Функция char *strrev(char *s); - меняет порядок следования символов в строке на противоположный (меняет первый символ с последним, второй символ с предпоследним и т.д.).

Типичная ошибка программирования. Забывают включить заголовочный файл string.h при использовании функций из библиотеки обработки строк.

Также, мы хотим Вас познакомить с двумя функциями, которые могут помочь программисту при чтении с клавиатуры символов:

Функция int getch(void); - возвращает ASCII-код нажатой клавиши. Функция int getche(void); - возвращает ASCII-код нажатой клавиши и выводит символ на экран.

Прототипы последних двух функций описаны в файле conio.h, который входит в стандартную библиотеку языка С++.

Задание к лабораторной работе

1. С клавиатуры вводятся символы, пока не встретится точка или количество введенных символов превысит 79. Вывести на печать общее количество введенных символов.

2. С клавиатуры вводится последовательность символов строки. После ввода каждого символа программа должна выводить запрос “Еще”Y/N?” и ждать ответа пользователя. Подсчитать количество введенных символов.

3. С клавиатуры вводится последовательность символов до тех пор, пока не встретится символ, не являющийся цифрой. Подсчитать количество введенных символов.

4. С клавиатуры вводится последовательность символов. Если символ является строчной буквой алфавита, то вывести на экран соответствующую ему прописную букву. Ввод символов прекратить, если встретится символ #.

5. С клавиатуры вводится произвольная последовательность символов. Для каждого символа выведите на экран следующую информацию:

Код символа.

Тип символа (буква латинского алфавита, буква кириллицы, цифра, остальные символы).

Ввод символов прекращается, если встретился символ #.

6. С клавиатуры вводится произвольное целое число от 0 до 255. Вывести на экран символ, соответствующий этому коду (если это возможно) и тип символа (управляющий, буква, цифра, символы псевдографики, прочие символы). Программа должна прекратить работу, если было введено число 256.

7. С клавиатуры посимвольно вводится предложение. Определить, какое это предложение - повествовательное, вопросительное или восклицательное, и вывести соответствующее сообщение на экран. Концом предложения считать следующие знаки препинания: ? ! и .

8. С клавиатуры посимвольно вводится предложение. Определить количество знаков препинания в предложении. Знаками препинания считать:. , - : ; ? !. Концом предложения считать следующие знаки препинания: ? ! и.

9. С клавиатуры вводятся символы до тех пор, пока не встретится конец предложения. Концом предложения считать символы : ! ?. Подсчитать количество введенных символов, отличных от пробела.

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

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

12.С клавиатуры посимвольно вводится предложение. Определить количество слов в предложении, не содержащих букву “у”.

13.С клавиатуры посимвольно вводится фраза. Определите, сколько имен собственных содержится в данной фразе. Именем собственным считать слово, начинающееся с большой буквы. Фраза считается введенной, если очередной веденный символ - точка.

14.C клавиатуры пользователем вводятся буквы английского алфавита в порядке их следования. В случае если порядок следования нарушается, выведите на экран сообщение, “Вы, к сожалению, не знаете английский алфавит”. Если все символы были введены правильно, выведите на экран сообщение “Отлично сработано!”

15.С клавиатуры посимвольно вводится предложение. Если предложение начинается со слова “Когда”, то вывести случайное число в диапазоне от 1001 до 1996. Если предложение начинается с другого слова, вывести на экран сообщение: “Задайте, пожалуйста, другой вопрос “.

16.C клавиатуры вводится буква русского алфавита. Выведите на экран информацию об этой букве. Например, буква М (эм), согласная, 13 в алфавите. Чтобы выяснить, когда пользователь захочет остановить процесс ввода букв, периодически спрашивайте “Продолжим Y/N?“.

17.C клавиатуры вводится буква русского алфавита. Если эта буква является согласной, то выведите информацию о звуке, который соответствует этой букве. Например, буква б - звук б, звонкий, буква ш - звук ш. Периодически спрашивайте у пользователя “Продолжим игру Y/N?”.

18.C клавиатуры посимвольно вводится фраза. Определите, из символов какого алфавита состоит введенная фраза, и выведите на экран одно из сообщений:
”Вы использовали только символы латинского алфавита”
”Вы использовали только символы кириллицы”.
”Вы пользовались символами разных алфавитов”.
Фраза считается введенной, если очередной веденный символ - точка.

19.Во введенной строке заменить все запятые на точки, а точки - на восклицательные знаки. Подсчитать количество сделанных замен.

20.Ввести в строковую переменную запись вещественного числа с фиксированной точкой. Дописать в ту же строковую переменную знак = и запись того же числа в форме с плавающей точкой.

21.В строку через пробел записано не более 10 отдельных слов. Записать каждое слово в отдельную строковую переменную и вывести на экран каждое слово в отдельной строке.

22.Даны две строки. Удалить из первой строки все символы, имеющиеся во второй.

23.Во введенной строке заменить все пробелы на запятые, а запятые - на точки. Подсчитать количество запятых в получившейся строке.

24.Записать в массив 10 строковых переменных. Отсортировать массив по возрастанию и объединить все его элементы в одну строку.

25.Даны две строки. Удалить из каждой из них символы, отсутствующие в другой.