Строки в стиле Си

Язык программирования С++ не содержит стандартного типа данных «строка». Для работы со строками существуют две возможности: функции, унаследованные из библиотеки языка Си и возможности, предоставляемые библиотечным классом string.

Строка в стиле Cи представляет собой массив символов, заканчивающийся нулевым символом (так называемый, терминальный ноль '\0').

Рассмотрим пример программы:

символьный массив с нулевым символом

Заметим, что в каждом случае массивы типа char инициализировались группой символов. Конечным символом в массиве Str является терминальный ноль. В результате для массива Str объект cout выводит первые 5 символов, встречает нулевой символ и прекращает вывод. Во втором случае, после печати 5 символов массива, происходит дальнейшее движение по последовательным байтам памяти, которые интерпретируются, как символы, подлежащие выводу, до тех пор, пока не встретится нулевой символ. Таким образом, символьные массивы без завершающего нулевого символа рассматривать как строки нельзя.

Инициализация символьного массива строковым литералом

  • char s2[ ] = "C-style character string";

Данный способ является безопасным, компилятор автоматически добавляет нулевой символ.

  • char s1[25] = "C-style character string";

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

Помещение строки в массив чтением из клавиатурного ввода

Ввод строки с клавиатуры связан с определенными трудностями. Рассмотрим следующую программу:

Ввод в поток cin

Как видно, в результате выполнения, программа отображает только символы до первого пробела. Это происходит, потому что оператор ввода считывает строку до первого пробельного символа (пробел, табуляция, символ новой строки). Для решения проблемы можно воспользоваться, например, библиотечной функцией gets(). Указанная функция считывает символы пока не будет нажата клавиша Enter. Для вызова gets() необходимо подключить заголовочный файл <cstdio> (#include <cstdio>)

Заметим, что оба способа ввода с клавиатуры являются потенциально опасными, поскольку ни оператор ввода, ни функция gets() не выполняют проверки нарушения границ массива.

Библиотечные функции обработки строк.

Язык С++ поддерживает большое количество функций для обработки строк. Чтобы воспользоваться этими функциями необходимо подключить заголовочный файл <cstring> (#include <cstring>)

Познакомимся с наиболее используемыми в программах функциями:

  • strlen(s) – возвращает длину строки, переданной в качестве аргумента
  • strcpy(s1, s2) - копирует содержимое строки s2 в строку s1
  • strcat(s1, s2) - добавляет строку s2 к строке s1
  • strcmp(s1, s2) - сравнивает строки s1 и s2 (лексикографически)
  • Функция strcmp возвращает:
  • значение 0, если строки s1 и s2 равны,
  • отрицательное значение, если строка s1 меньше s2
  • положительное значение, если s1 больше s2.