Работа со строками — это набор команд и операций для обработки строковых переменных.
Обработка строк
Программный язык C++ имеет одну пару переменных для обработки строковых данных. Одна из них применялась ещё в C, и считается самым быстрым способом обработки строк, но не очень удобным в повседневном применении. В языковом формате C, информация в строке являлась только указателем на начальный символ этой строки. Для возможности обработки строки библиотечной функцией, ей необходимо было иметь окончание в форме нулевого байта, то есть символа с нулевым кодированием. Объявление строковой переменной возможно выполнить при помощи двух методов.
Метод первый. В форме указателя char *s. В таком варианте разработчику программы необходимо самому выделять объём памяти, требуемый под символику, которая входит в строковые данные. К примеру, это возможно выполнить таким образом:
s = new char[количество_символики_строк+1];
Прибавление единицы в конце требуется для сохранения символа нуля в конце строки. Если применяются динамические массивы, необходимо вовремя их освободить с помощью команды delete. Но можно выполнить инициализацию этой переменной константой строки:
char *s = "текст_строки";
Это возможно сделать, так как в языке С++ константа строки является простым указателем на начальный символ строки, которая заключается в кавычки (конечный символ нулевого значения в автоматическом режиме добавит программа компиляции). Но, необходимо помнить, что константы строки сохраняются в области памяти с защитой от записи. То есть, если строка определена таким образом, то нет возможности менять её составляющие элементы. Если необходимо всё же иметь такую возможность, то следует применять простые или динамические массивы.
Метод второй – метод массива:
char s[наибольшее_количество_символов+1];
В этом варианте выделение памяти производится в автоматическом режиме программой компиляции, и символику этих строковых переменных возможно изменять. Но в случае, если такой массив является локальной переменной, необходимо помнить, что он буде удалён по завершению действия поддерживающей его функции. К тому же, такая строка не может быть возвращена из функции, где выполнено её определение (чтобы это стало возможным, необходимо использовать динамический массив). Эту строку возможно инициализировать как стандартным для массива способом (в данном случае конечный символ, закодированный нулём, пишется в явной форме)
char s[число] = { ’H’, ’e’, ’l’, ’l’, ’o’, ’\0’ };
так и в усечённом формате (конечный символ с нулями добавит в автоматическом режиме программа компиляции)
char s[число] = "Hello";
Так же, как и с массивами, количества компонентов, прописанных в квадратных скобках, должно хватать для запоминания всей символики строки и, в том числе, конечного нулевого символа. Если требуется совпадение объёма массива с количеством символов строковой постоянной, записанной в него (нуль тоже считается), то число в квадратных скобках можно не указывать:
char s[ ] = "Hello";
В данном примере определяется шестисимвольный массив.
Типы символов
Файл заголовка cctype включает в свой состав комплект специальных макроопределений, позволяющих проверить, принадлежит ли символ к некоторому классу. К примеру, предположим, что С является символьной переменной, тогда isspace(c) станет правильным, если С символ пробела. Этих макроопределений большое количество, среди которых наиболее часто применяемыми являются: isdigit – обозначение цифры и isalpha – обозначение латинского символа. Следует заметить, что все макро определения возвращают нуль, если утверждение ложно, но если оно истинно, то возвращается не единица, а некое число, отличное он нуля.
Обращение к конкретному знаку из строки S по его индексации (отсчитывается с нуля), как и для всех массивов, записывается так: s[индекс].
Строковые операции
Для использования функций библиотеки для строковых операций, требуется подключение файла: cstring. При этом:
- Размер строки S задаётся функцией strlen(s).
- Нет возможности присвоения и сравнения строк с помощью стандартных операций сравнения.
Чтобы иметь возможность копировать строки, есть функция strcpy, которая принимает пару указателей на символы dest и src. Она копирует строку, на которую ссылается src, в массив памяти, указанный dest. Конечный нулевой символ так же подлежит автоматическому копированию этой функцией. К примеру, добавим слово "Hello" в массив символов s:
strcpy(s, "Hello");.
При этом следует иметь в виду два важных момента:
- Пара строк, находящихся в обработке у strcpy, не должны иметь перекрытий в памяти. К примеру, этот способ сдвига строки путём удаления её первого символа, буде ошибкой: strcpy(s, s+1);.
- Разработчик программы обязан сам контролировать предоставление достаточного объёма памяти в строке dest, чтобы в неё возможно было записать строки src. Бывает, что операционная система отлавливает подобные ошибки, но есть вероятность и выдачи программой неправильного итога. Гарантию в этом случае даёт применение функции strncpy, которая обладает добавочным параметром (он последний). Он задаёт количество символов для копирования. Когда строка src более короткая, недостающие до требуемого количества символы принимают нулевые значения, но если строка более длинная, то не прописывается последний нулевой символ.
Если требуется сравнить строки, нужно воспользоваться функцией strcmp, у которой в параметрах задаются строки, которые требуется сравнить. При совпадении строк эта функция выполняет возврат нулевого значения. Если первая строка имеет меньшую длину, чем вторая, то возвращается число со знаком минус, если наоборот, то возвращается число со знаком плюс. То есть проверить равны ли строки между собой, возможно следующим образом:
strcmp(a, b)==0.
Ещё есть функция strcat, которая также обладает двумя параметрами, и выполняет присоединение к первой строке, которая записана в первом параметре, вторую строку, которая есть во втором параметре.