Кроме массивов, которые содержат данные обычных числовых форматов, так же существуют и массивы символов. Эти массивы содержат элементы типа char. То есть массив, в котором находится слово London будет таков: char londonArr[] {'L', 'o', 'n', 'd', 'o', 'n'}. В C++ есть стандартная библиотека string.h, которая имеет в себе множество функций для работы со строками. Строка же в свою очередь - это тот же массив символов, но последний его элемент - нулевой символ, символ окончания строки. Он записывается так: \0. Значит, для корректной записи массива londonArr и его дальнейшего использования в программе как строки, следует добавить в конце нулевой символ. Теперь его инициализация будет выглядеть так: londonArr[] {'L', 'o', 'n', 'd', 'o', 'n', '\0'}. Вас может удивить то, что последовательность символов \0 взята в одинарные кавычки, в то время, как эти кавычки могут содержать лишь один символ. Но последовательность \0 обозначает только один символ. Точно такая же ситуация с символами \t (табуляции), \n (перевод строки) и т. д.
Способ инициализации строки по символам оказался слегка неудобным, поэтому в C++ есть более практичная форма записи: londonArr[] {"London"}. В данном случае компилятор видит литерал "London" как строку, поэтому сам распределит символы в отдельные элементы массива, а так же в конец вставит нулевой символ.
Уже хорошо знакомые нам функции ввода и вывода так же умеют работать и со строками. Только есть некоторая особенность: функция cin считывает строку до первого пробела. cout в данном случае выводит строку полностью, даже если нам удастся засунуть пробелы в строку. Но есть и другое неудобство в использовании cin. Эта функция может считать сколько угодно символов, а затем попытается запихнуть в созданный массив, а данный поток данных просто не поместится. Проблема в том, что количество элементов массива задается константой или литералом, а считанное множество символов может в несколько раз превышать размер массива. Что бы полностью избавиться от этих проблем, для считывания строки будем пользоваться функцией getline, которая как бы расширяет возможности функции cin. Записывается это так: cin.getline(str, numOfChars). str - считывания строка, numOfChars - максимально возможное количество символов, которое будет считано. Рассмотрим программу ниже:
#include <iostream>
using namespace std;
int main() {
char str1[10], str2[10];
cin.getline(str1, 10);
cin.getline(str2, 10);
cout << str1 << endl << str2 << endl;
}
Как видно из примера, первая строка имеет длину в 4 символа и она полностью помещается в массив из десяти элементов. Вторая же строка имеет аж 12 символов, вместе с символом окончания строки. Последние два символа a и t "отрезались" и к строке в 9 символов (Amazing C) так же присоединился десятый символ \0.
Работа со строками требует подключения библиотеки string. Ниже приведена таблица функций, которые понадобятся нам в процессе написания программы.
| Название функции | Описание |
|---|---|
| strlen(str) | Определяет длину строки без нулевого символа |
| strcpy(str1, str2) |
Копирует строку str2 в строку str1
|
| strncpy(str1, str2, n) |
Копирует n символов из строки str2 в строку str1
|
| strcat(str1, str2) |
Объединяет строку str2 и str1 в строку str1
|
| strncat(str1, str2, n) |
Объединяет n символов из строки str2 со строкой str1 и сохраняет результат в строке str1
|
| strcmp(str1, str2) |
Сравнивает строки и возвращает 0, если строки одинаковы, <0, если str1 > str2, >0, если str1 < str2. Функция работает с учетом регистра. (Функция stricmp для сравнивания без учета регистра)
|
| strncmp(str1, str2) |
Сравнивает n символов строки str1 со строкой str2 и возвращает 0, если строки одинаковы, <0, если str1 > str2, >0, если str1 < str2. Функция работает с учетом регистра. (Функция strnicmp для сравнивания без учета регистра)
|
| strchr(str, ch) |
Выполняет поиск символа ch в строке str и возвращает указатель на первое вхождение данного символа в строке. Если символ не найден, функция возвращает ноль.
|
| strspn(str1, str2) |
Возвращает длину первой части строки str1, содержащая символы, которые есть с строке str2
|
| strcspn(str1, str2) |
Возвращает длину первой части строки str1, содержащая символы, которых нет в строке str2
|
| atof(str) |
Преобразует строку str в число типа double (long float)
|
| atoi(str) |
Преобразует строку str в число типа int
|
| atol(str) |
Преобразует строку str в число типа long int
|
| Название функции | Описание |
|---|---|
| isalnum(ch) |
Возвращает true, если ch является буквой или цифрой
|
| isalpha(ch) |
Возвращает true, если ch является буквой
|
| islower(ch) |
Возвращает true, если ch является буквой нижнего регистра
|
| isupper(ch) |
Возвращает true, если ch является буквой верхнего регистра
|
| isdigit(ch) |
Возвращает true, если ch является цифрой
|
| isspace(ch) |
Возвращает true, если ch является пробелом
|
| toupper(ch) |
Возвращает символ ch в верхнем регистре
|
В C++ так же есть тип для строк - string. Он находится в библиотеке cstring и представляет собой более удобную работу со строками. Объекты типа string можно считывать и выводить стандартными функциями ввода и вывода. Так же как и с обычными строками, новые строки считываются до первого пробела, или до конца строки. Интересно то, что данные строки можно конкантенировать при помощи знака + (плюс).