Строка состоит из последовательности символов, ограниченных нулевым символом (‘\0’), сохраненная в расположенных последовательно байтах памяти. Иными словами – одномерный символьный массив представляет собой строку символов. В языке С++ существует два вида строк:
- массив символов (строка), завершающаяся нулевым байтом (null-terminated string), унаследованный от С и называемый строки в стиле С.
- строки типа string реализуются объектно-ориентированным подходом к программированию основанные на библиотечном классе string.
Строки первого вида имеют три варианта представления строки:
- массив char;
- константная строка в двоичных кавычках (называемая строковым литералом);
- указатель на char, содержащий адрес начало строки.
В трёх вариантах имя массива является указателем на char. При объявлении строки как массив символов, необходимо размер указать на единицу больше длины предполагаемой последовательности символов. Переменные типа массива символов обладают свойствами, как простой переменной, так и структурированной. Свойствами структурированного типа является обработка каждого элемента массива отдельно, а свойствами простого типа – весь массив обрабатывается целиком, как скалярная переменная. каждая отдельно взятая литера представлена некоторым числом, называемым кодом
Примеры объявления:
char SM = ‘A’; // переменная символьного типа SM инициализируется одной переменной, поэтому она заключена в одинарные кавычки;
char SM1[] = {‘F’,’I’,’L’,’E’,’S’}; //массив символов состоящий из 5 литеров, обладает свойствами массива но свойствами строки не обладает.
char SM2[] = {‘F’,’I’,’L’,’E’,’S’,’\0’}; //наличие нулевого символа придает свойства строки. Этот символ (‘\0’) представляет собой символ с ASCII-кодом 0, служит меткой конца строки.
char SM3[10] = “FILES”; //во время компиляции в ОП выделится 10 байтов памяти. На 0 месте расположится символ F, на первом – I, на 2 – L, на 3 – E, на 4 – S, а с 5 по 9 места автоматически присвоится нулевой символ. Эта строка называется строковой константой или строковым литералом. Строки в кавычках всегда неявно включают ограничивающий нулевой символ
char SM4[] = “FILES”; //под строковую константу SM4 в ОП выделится 6 байтов памяти, последним элементом автоматически установится нулевой байт.
Все имена SM1, SM2, SM3, SM4 имеют адрес элемента стоящего на нулевом месте, обращение к каждому элементу можно осуществлять по его порядковому номеру (SM1[i]). При вводе строковых переменных нулевой байт записывается в конец автоматически. Если же формирование строки происходит в программе, программист должен самостоятельно позаботиться о наличии нулевого байта. Строковая константа (с двойными кавычками) не взаимозаменяема с символьными константами (с одинарными кавычками).
char SM5 = ‘S’; //символьная константа ‘S’ – это сокращенное обозначение для кода символа 83 в системе ASCII, поэтому данный оператор присваивает значение 83 переменной SM5, но “S” представляет строку состоящую из двух символов – S и\0, и еще адрес ОП , по которому размещается строка. Поэтому оператор
char SM5 = “S”; //не соответствие типов.
Функции, которые работают со строками, руководствуются положением нулевого символа, а не размером массива. С++ не накладывает никаких ограничений на длину строки.
Функции для обработки срок работают, проходя по строке символ за символом до тех пор, пока не встретится нулевой символ.
Вывод строки символов:
cout <<SM2<<SM3<<SM4;//выведет каждый раз FILES, т.к. встретит нулевой символ и на этом остановится. Вывод работает как со скалярной переменной.
cout <<SM1; //будет выводить бесконечно, т.к. будет двигаться по памяти, выводя байт за байтом, интерпретируя каждый из них как символ, подлежащий печати, пока не встретит нулевой символ.
Ввод строки символов:
Класс istream включает функцию-член get(), которая читает ввод до конца строки, заменяет его нулевым символом при сохранении строки, но вместо того, чтобы прочитать и отбросить символ перевода строки на новую, get() оставляет его во входной очереди. Предположим это и используем два вызова get():
#include <iostream>
using namespace std ;
int main ( )
{
char SM2 [100 ],SM3[100];
cin.get(SM2,100);
cin.get(SM3,100);
return 0 ;
}
Поскольку код клавиши ENTER (#13) состоит из двух частей:
1: - признак конца строки;
2: - перевод на новую строку;
первый вызов оставляет символ перевода на новую строку во входной очереди. Символ новой строки оказывается первым символом, который видит следующий вызов. Т.о. второй вызов get() читает символ новой строки и завершает чтение, не прочтя необходимое. На помощь приходит вызов cin.get() без аргументов читает единственный следующий символ, даже если он будет символ новой строки, т.е. следующая последовательность будет работать правильно.
char SM2 [100 ],SM3[100];
cin.get(SM2,100); //читает првую строку
cin.get(); //читает символ перевода строки
cin.get(SM3,100); //читает вторую строку
Другой способ применения состоит в канкатинации двух вызовов функций-членов класса, как показано в следующем примере: