Тема: Строки и символьные массивы

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

Текст в кавычках - строковая константа. Кавычки используются для определения начала и конца строковой константы и её частью не являются.

C++ для хранения строк использует символьные массивы. Можно представить символы такого массива расположенными последовательно в соседних ячейках памяти – в каждой ячейке хранится один символ и занимает один байт. Один байт потому, что каждый элемент символьного массива имеет тип char. Последним символом каждой такой строки является символ \0 (нулевой символ). Например:

Сам текст, включая пробел, состоит из 11-ти символов. Если бы в последней ячейке находилась например. (точка), а не нулевой символ \0 – для компилятора это уже не строка. И работать с таким набором символов надо было бы, как с обычным массивом – записывать данные в каждую ячейку отдельно и выводить на экран посимвольно (при помощи цикла):

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include <iostream> using namespace std;   int main() {  setlocale(LC_ALL, "rus");    char str[12] = {'Ж','и','л','-','б','ы','л',' ','п','ё','с','.'};    for (int i = 0; i < 12; i++)  {  cout << str[i];  }  cout << endl;    return 0; }

К счастью в C++ есть куда более удобный способ инициализации и обращения к символьным массивам – строкам. Для этого последним символом такого массива обязательно должен быть нулевой символ \0. Именно он делает набор символов строкой, работать с которой, гораздо легче, чем с массивом символов.

Объявляется строка таким образом – создаем массив типа char, размер в квадратных скобках указывать не обязательно (его подсчитает компилятор), оператор = и в двойных кавычках пишем необходимый текст. То есть инициализируем массив строковой константой:

1 2 3 4 5 6 7 8 9 10 11 12 13 #include <iostream> using namespace std;   int main() {  setlocale(LC_ALL, "rus");    char str[] = "Жил-был пёс"; // '\0' присутствует неявно    cout << str << endl;    return 0; }

Прописывать нулевой символ не надо. Он присутствует неявно и добавляется в каждую такую строковую константу автоматически. Таким образом, при том что мы видим 11 символов в строке, размер массива будет 12, так как \0 тоже символ и занимает один байт памяти. Займет он последнюю ячейку этого символьного массива.

Как видите, для вывода строки на экран, достаточно обратиться к ней по имени: cout << str << endl; cout будет выводить на экран символ за символом, пока не встретит в одной из ячеек массива символ конца строки \0 и вывод прервется. Такое обращение для обычного символьного массива (массива без \0) недопустимо.

Так как компилятор выводил бы символы на экран даже выйдя за рамки массива, пока не встретил бы в какой-то ячейке памяти символ \0. Можете попробовать подставить в первый пример вместо цикла оператор cout << str << endl; и увидите, что получится. У меня показало вот так:

Хочу обратить ваше внимание на отличие символьной константы (в одинарных кавычках – 'f', '@') от строковой константы (в двойных кавычках "f", "@"). Для первой, компилятором C++ выделяется один байт для хранения в памяти. Для символа записанного в двойных кавычках, будет выделено два байта памяти – для самого символа и для нулевого (добавляемого компилятором).

Что если строку должен будет ввести пользователь с клавиатуры? В этом случае необходимо объявить массив типа char с указанием его размера достаточного для хранения вводимых символов, включая \0. Не забывайте об этом нулевом символе. Если вам надо хранить 3 символа в массиве, его размер должен быть на единицу больше – то есть 4.

char siteName[20] = "";

Используя пустые кавычки при инициализации, мы присваиваем каждому элементу массива значение \0. Таким образом строка будет очищена от “мусора” других программ. Даже если пользователь введет название содержащее меньшее количество символов, следующий за названием будет символ \0.

ввод через cin необходимо производить латиницей[1]. О том как корректно ввести кириллицу будет рассказано в отдельной статье. Тут вы видите, что цитату мы ввели, но при выводе на экран, видим только первое слово. Это связано с тем, что мы не можем ввести нулевой символ с клавиатуры, а cin воспринимает пробел, символ новой строки и табуляцию, как конец строки. То есть в нашем случае cin прочитал только первое слово, запятую и автоматически добавил знак конца строки. Остальные введенные данные поместил во входную очередь.

Решается эта проблема просто. В C++ есть функции get() и getline(), которые мы можем использовать вместе с cin. Они похожи, но чаще используется getline(). В этой статье мы не будем рассматривать их отличие. Допишем в нашу программу ввод с getline ():

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #include <iostream> using namespace std;   int main() {  setlocale(LC_ALL, "rus");    char quote[128] = "";    cout << "Ваша любимая цитата из мультфильма \"Винни Пух\": \n";  cin.getline(quote, 128); // передаем в функцию имя массива и его размер  cout << quote << endl;    return 0; }

Вы видите, что в скобках мы указали для функции два аргумента – в какой массив считать символы (имя массива) и размер этого массива – строка 11. Результат нам подходит – всё отобразилось правильно. cin.getline() считывает в массив всю строку включая пробелы и табуляции, пока не произойдет нажатие Enter или пока не будет превышен размер массива. Символ новой строки в массиве не сохранится, а заменится на нулевой символ.

Возьмем группу студентов из десяти человек. У каждого из них есть фамилия. Создавать отдельную переменную для каждого студента — не рационально. Создадим массив, в котором будут храниться фамилии всех студентов.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: