- •Конспект лекций Часть 1 Оглавление
- •Часть 1 1
- •Введение
- •1. Этапы и проблемы решения задач с использованием компьютера
- •Алфавит языка
- •Ключевые слова
- •Идентификаторы
- •Знаки операций
- •Константы
- •Комментарии
- •2.3. Структура и основные элементы программы
- •2.4. Трансляция программ и их выполнение
- •3. Стандартные (базовые) типы данных, операции и выражения
- •3.1. Типы данных, переменные и константы Понятие типов данных
- •Классификация простых предопределенных типов данных
- •Переменные, константы
- •3.2. Целочисленные типы данных
- •3.3. Вещественные типы данных
- •3.4. Логический тип данных
- •3.5. Символьный тип данных
- •3.6. Операции и выражения
- •Преобразования типов данных
- •Операция присваивания
- •Арифметические операции
- •Операции отношения
- •Логические операции
- •Поразрядные (битовые) операции
- •Операции составного присваивания
- •Условная операция
- •Операция sizeof
- •Приоритеты рассмотренных операций
- •3.7. Ввод и вывод простых типов данных
- •Вывод текстовых строк
- •Ввод/вывод арифметических типов данных
- •Форматирование ввода / вывода
- •4.1. Идеи структурного программирования
- •Условная инструкция (if)
- •Инструкция множественного выбора (switch)
- •Цикл с предусловием (while)
- •Цикл с постусловием (do while)
- •Итерационный цикл (for)
- •Инструкции перехода
- •5. Приемы программирования циклов
- •5.1. Рекуррентные вычисления
- •5.2. Инвариант цикла
- •6. Массивы
- •6.1. Понятие массива
- •6.2. Объявление массивов Объявление одномерных массивов
- •Объявление многомерных массивов
- •6.3. Ввод-вывод массивов
- •Вывод массивов
- •Ввод массивов
- •6.4. Текстовые строки как массивы символов
- •Определение текстовой строки
- •Ввод текстовых строк с клавиатуры
- •Обработка текстовых строк
- •Массивы текстовых строк
- •7. Разработка программ при работе с массивами
- •Не успел дописать. Некоторые примеры по этому разделу в Приложениях
6.4. Текстовые строки как массивы символов
В языке C++ текстовая строка представляет собой набор символов, обязательно заканчивающийся нулевым символом (‘\0’) Текстовые строки представляются с помощью одномерных массивов символов.
Определение текстовой строки
Для хранения текстовых строк из m символов необходимо определить одномерный массив символов с количеством элементов, равным m + 1:
const m = 20;
char Str [m + 1];
или
char Str [21];
Переменная Str может использоваться для хранения текстовых строк, содержащих не более 20 символов (максимум 20 обычных символов + нулевой символ ‘\0’).
Нулевой символ позволяет определить границу между содержащимся в строке текстом и неиспользованной частью строки.
При определении строковых переменных их можно инициализировать конкретными значениями с помощью строковых литералов:
char S1 [15] = “This is text”;
char S2 [ ] = “Это пример текста”;
char S3 [20] = “”;
char S4 [ 5 ] = “Error”;
Картинка памяти для строки S1 будет такой:
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
‘T’ |
‘h’ |
‘i’ |
‘s’ |
‘ ’ |
‘i’ |
‘s’ |
‘ ’ |
‘t’ |
‘e’ |
‘x’ |
‘t’ |
‘\0’ |
|
|
Последние два элемента переменной S1 в данном случае не используются.
Строка S2 автоматически подстраивается под длину инициализирующего текста (плюс нулевой символ) и будет содержать 18 символов.
Строка S3 инициализируется “пустой” строкой “” и содержит один нулевой символ ‘\0’.
Попытка инициализировать строку S4 словом “Error” закончится неудачей, так как в переменную S4, имеющую размер в 5 символов, можно записывать тексты с максимальным количеством символов не более 4.
При работе со строками можно обращаться к отдельным символам строки как в обычном одномерном массиве с помощью индексов:
cout << S1[6]; // На экран будет выведен символ ‘s’
Если строка формируется программно, необходимо в конец ее обязательно записать нулевой символ ‘\0’:
char Str[21];
int i = 0;
for (char c = ‘A’; i < 6; i++, c++)
Str [i] = c;
Str [i] = ‘\0’; // “закрываем” строку нулевым символом
cout << Str << endl; // на экран выведено: ABCDEF
Если не добавить нулевой символ, то на экран будут выведены все 21 символов массива Str. Значения последних 14 символов предсказать невозможно.
Ввод текстовых строк с клавиатуры
Вывод текстовых строк на экран сложностей не вызывает:
char Str[21] = “Это пример текста”;
cout << setw(40) << right << Str << endl;
cout << “Это текстовый литерал.” << endl;
При выводе строк можно использовать форматирование (манипуляторы или функции потока вывода).
Ввод текста с клавиатуры можно осуществить разными способами, каждый из которых имеет определенные особенности.
Непосредственное чтение текстовых строк из потока вывода:
char Str[21];
cin >> Str; // Пусть введена строка “Это пример текста”
cout << Str << endl; // На экран будет выведено только слово “Это”
Как видно, всю введенную строку текста прочитать не удалось. Такой способ чтения (с помощью оператора >>) обеспечивает ввод символов до первого пробельного символа (по словам), а не до конца строки. Остальные символы введенного с клавиатуры предложения остаются в потоке ввода и могут быть прочитаны из него следующими операторами >>.
Для того чтобы прочесть всю строку полностью, можно воспользоваться одной из функций gets или gets_s (для этого в программу должен быть включен заголовочный файл <stdio.h>):
const int N = 21;
char Str [N];
gets (Str); // Пусть введена строка “Это пример текста”
// gets_s (Str, N); Альтернативный вариант
cout << Str << endl; // На экран будет выведено “ Это пример текста”
Функция gets имеет один параметр, соответствующий массиву символов, в который осуществляется чтение. Вторая функция (gets_s) имеет второй параметр, задающий максимальную длину массива символов Str.
Не смотря на то, что функция gets_s (в отличие от gets) позиционируется как безопасная, и та и другая при вводе текста, длина которого (вместе с нулевым символом) превышает значение второго параметра (то есть длины символьного массива Str), приводит к возникновению ошибки при выполнении программы
Более предпочтительным, по-видимому, является использование функции потока ввода cin.getline:
const int N = 21;
char Str [N];
cin.getline (Str, N); // Пусть введена строка “Это пример текста”
cout << Str << endl; // На экран будет выведено “ Это пример текста”
В этой функции первый параметр Str соответствует массиву символов, в который должна быть записана взятая из потока ввода текстовая строка. Второй параметр - задает максимальное количество символов, которое может быть помещено в массив Str (с учетом завершающего нулевого символа, который добавляется в конец введенного текста автоматически).
Если длина введенного с клавиатуры текста превышает максимальную длину массива Str, в него будет записано (в нашем примере) 20 символов вводимого текста и нулевой символ. Остальные символы введенного текста остаются во входном потоке и могут быть взяты из него следующими инструкциями ввода.
Рассмотри следующий пример:
const int N = 11;
char Str [N];
cin.getline (Str, N); // Пусть введена строка “Это пример текста”
cout << Str << endl; // На экран будет выведено “Это пример” – 10 символов
cin.getline (Str, N); // Ожидается чтение остальных символов: “ текста”
cout << Str << endl; // Однако на экран будет выведена пустая строка
Все последующие попытки чтения из потока будут игнорироваться. Причина этого кроится в том, что попытка чтения введенного слишком длинного текста, переводит входной поток в состояние ошибки, при котором дальнейшее чтение из потока невозможно. Для того чтобы продолжить чтение из потока, необходимо восстановить его нормальное состояние. Этого можно достигнуть с помощью функции потока cin.clear(), которая сбрасывает состояние потока в нормальное:
const int N = 11;
char Str [N];
cin.getline (Str, N); // Пусть введена строка “Это пример текста”
cout << Str << endl; // На экран будет выведено “Это пример” – 10 символов
cin.clear(); // Сбрасываем состояние потока в норму
cin.getline (Str, N); // Не останавливаясь дочитываем оставшиеся в потоке символы
cout << Str << endl; // На экран выведено: “ текста”
Если забирать остатки данных из потока ввода не надо, то следует очистить его с помощью функции cin.sync():
const int N = 11;
char Str [N];
cin.getline (Str, N); // Пусть введена строка “Это пример текста”
cout << Str << endl; // На экран будет выведено “Это пример” – 10 символов
cin.clear(); // Сбрасываем состояние потока в норму
cin.sync(); // Очищаем поток от оставшихся символов
cin.getline (Str, N); // Ждем очередного ввода данных. Введено: “Слово”
cout << Str << endl; // На экран выведено: “Слово”
Правильное использование функций cin.clear() и cin.sync() является очень существенным фактором при организации консольного ввода данных.
Функция cin.getline может иметь третий параметр, задающий символ, при встрече которого чтение строки из потока прекращается. Например:
cin.getline (Str, N, ‘,’);
При таком использовании этой функции чтение из потока будет прекращено, если из него прочитано N – 1 символов, или встретился символ конца строки ввода, или встретился символ ‘,’.