Специальный класс string.
Массив переменных типа char.
Строкой называется массив символов, который заканчивается пустым символом ‘\0’. Переменная типа char хранит в себе 1 символ. Размер строки равняется размеру массива - 1, т.к. последний элемент содержит NULL (пустая переменная), который обозначает символ конца строки.
Строка объявляется как обычный символьный массив, например,
char s1[10]; // строка длиной в девять символов
или: char *s2; // указатель на строку
Различие между указателями s1 и s2 заключается в том, что указатель s1 является именованной константой, а указатель s2 – переменной.
Пример: char name[50];
cin>>name; cout<<"Hello "<<name<<endl;Строковые константы заключаются в двойные кавычки в отличие от символов, которые заключаются в одинарные кавычки. Например, “This is a string.”
При инициализации строк размерность массива лучше не указывать, это выполнит компилятор, подсчитав длину строки и добавив к ней единицу. Например, char s1[ ] = “This is a string.”;
Для работы со строками существует большое количество функций, прототипы которых описаны в заголовочных файлах stdlib.h и string.h.
Стандартные функции для работы со строками.
Функции для работы со строками, прототипы которых описаны в заголовочном файле string.h.
1. Сравнение строк. Для сравнения строк используются функции strcmp и strncmp.
Функция int strcmp (const char *str1, const char *str2);
сравнивает строки str1, str2 и возвращает –1, 0 или 1, если строка str1 соответственно меньше, равна или больше строки str2.
Функция int strncmp (const char *str1, const char *str2, size_t n);
сравнивает не более чем n первых символов из строк str1 и str2. Функция возвращает –1, 0 или 1, если первые n символов из строки str1 соответственно меньше, равны или больше первых n символов из строки str2.
|
2. Копирование строк. Для копирования строк используются функции strcpy и strncpy.
Функция char *strcpy (char *str1, const char *str2);
копирует строку str2 в строку str1. Строка str2 копируется полностью, включая завершающий нулевой байт. Функция возвращает указатель на str1. Если строки перекрываются, то результат непредсказуем.
Функция char *strncpy (char *str1, const char *str2, size_t n);
копирует n символов из строки str2 в строку str1. Если строка str2 содержит меньше чем n символов, то последний нулевой байт копируется столько раз, сколько нужно для расширения строки str2 до n символов. Функция возвращает указатель на строку str1.
3. Соединение строк. Для соединения строк в одну строку используются функции strcat и strncat.
Функция char* strcat (char *str1, const char *str2);
присоединяет строку str2 к строке str1, причем завершающий нулевой байт строки str1 стирается. Функция возвращает указатель на строку str1.
Функция char* strncat (char *str1, const char *str2, size_t n);
присоединяет n символов из строки str2 к строке str1, причем завершающий нулевой байт строки str1 стирается. Функция возвращает указатель на строку str1. если длина строки str2 меньше n, то присоединяются только символы, входящие в строку str2. После соединения строк к строке str1 всегда добавляется нулевой байт. Функция возвращает указатель на строку str1.
4. Поиск символа в строке. Для поиска символа в строке используются функции strchr, strrchr, strspn, strcspn и strpbrk.
Функция char* strchr (const char *str, int c);
ищет первое вхождение символа, заданного параметром c, в строку str. В случае успеха функция возвращает указатель на первый найденный символ, а в случае неудачи – NULL.
|
Функция char* strrchr (const char *str, int c);
ищет последнее вхождение символа, заданного параметром c, в строку str. В случае успеха функция возвращает указатель на последний найденный символ, а в случае неудачи – NULL.
Функция size_t strspn (const char *str1, const char *str2);
возвращает индекс первого символа из строки str1, который не входит в строку str2.
Функция size_t strcspn (const char *str1, const char *str2);
возвращает индекс первого символа из строки str1, который входит в строку str2.
Функция char* strpbrk (const char *str1, const char *str2);
находит первый символ в строке str1, который равен одному из символов в строке str2. В случае успеха функция возвращает указатель на этот символ, а в случае неудачи – NULL.
5. Сравнение строк. Для сравнения строк используются функция strstr.
Функция char* strstr (const char *str1, const char *str2);
находит первое вхождение строки str2 (без конечного нулевого байта) в строку str1. В случае успеха функция возвращает указатель на найденную подстроку, а в случае неудачи – NULL. Если указатель str1 указывает на строку нулевой длины, то функция возвращает указатель str1.
6. Разбор строки на лексемы. Для разбора строки на лексемы используется функция strtok.
Функция char* strtok (char *str1, const char *str2);
возвращает указатель на следующую лексему (слово) в строке str1, в которой разделителями лексем являются символы из строки str2. В случае если лексемы закончились, то функция возвращает NULL. При первом вызове функции strtok параметр str1 должен указывать на строку, которая разбирается на лексемы, а при последующих вызовах этот параметр должен быть установлен в NULL.
|
7. Определение длины строки. Для определения длины строки используется функция strlen.
Функция size_t strlen (const char *str);
возвращает длину строки, не учитывая последний нулевой байт. Например,
char str[] = "123";
printf ("len = %d\n", strlen (str)); // печатает: len = 3
2) Класс string. Для его работы необходимо подключить заголовочный файл string: #include <string>
В отличие от типа char, string является классом. Классы содержат в себе: переменные, константы и функции.
Для создания строки необходимо в начале программы написать using namespace std;
Создание строки: string s;
Запись в строку: s="Hello";
Пример работы с классом string: string name;
cout<<"Enter your name"<<endl; cin>>name; cout<<"Hi "<<s<<"!"<<endl;При работе со строками не надо задавать ее размер.
Основные функции для работы со строками:
- s.append(str) - добавляет в конец строки строку str
- s.assign(str) - присваивает строке s значение строки str. Аналогично записи s=str;
- int i=s.begin() - записывает в i индекс первого элемента строки
- int i=s.end() - аналогично, но последнего элемента строки
- s.clear() - отчищает строку, т.е. удаляет все элементы в ней
- s.compare(str) - сравнивает строку s со строкой str и возвращает 0 в случае совпадение
- s.copy (куда, сколько, начиная с какого) - копирует из строки s в куда (может быть строка типа string типа char). Последние 2 параметра не обязательные (можно использовать функцию с 1,2 или 3 параметрами)
- bool b=s.empty() - если строка пуста, возвращает true, иначе false
- s.erase(откуда, сколько)- удаляет n элементов с заданной позиции
- s.find(str,позиция) - ищет строку str начиная с заданной позиции
- s.insert(позиция,str, начиная, beg, count) - вставляет в строку s с заданной позиции часть строки str с позиции beg и вставляя count символов
- int len=s.length() - записывает в len длинну строки
- s.push_back(symbol) - добавляет в конец строки символ
- s.replace(index, n,str) - берет n первых символов из str и заменяет символы строки s на них, начиная с позиции index
- str=s.substr(n,m) - возвращает m символов начиная с позиции n
- s.swap(str) - меняет содержимое s и str местами.
Примеры. Постарайтесь понять, что делает каждый пример:
Практика.
Задачи для строк типа char:
- Ввести строку S и подстроку S1. Если подстрока S1есть в введенной строке S, вывести “YES”, иначе “NO”.
- Ввести 3 строки: S1, S2, S3. Заменить в строке S3 строку S1 на строку S2.
Задачи для строк типа string:
- Ввести текст S и вводят подстроку S1, найти количество вхождений подстроки S1в тексте S.
- Вводят текст S и два слова S1 и S2, заменить все слова S1 на слова S2.
- Вводят 2 текста S1 и S2. Сравнить их, объединить, вывести все пробелы, точки, запятые, двоеточия. Вывести размер каждого текста и общий размер. Поменять все буквы «з» на «z» и «и» на «i», вывести количество замен.