- •2. Структура и основные элементы программы
- •3.Общее понятие типов данных
- •4. Переменные и константы
- •5.Основные типы данных
- •6. Спецификаторы типов данных
- •7. Определение переменных и констант в программе
- •8. Инициализация переменных различных типов
- •9.Целочисленные типы данных
- •10. Вещественные типы данных
- •11. Особенности представления вещественных типов данных
- •12.Логический тип данных
- •13. Символьный тип данных
- •14. Управляющие последовательности
- •15. Операции и выражения
- •16. Операция присваивания, составные операции присваивания
- •17. Понятие l-значения
- •18. Преобразование типов данных
- •19. Арифметические операции
- •20. Операции инкремента и декремента, их разновидности
- •21. Операции отношения
- •22. Логические операции
- •23. Побитовые операции сдвига
- •24. Побитовые логические операции
- •25. Примеры применения побитовых операций
- •26. Условная операция и ее использование
- •27. Определение объема памяти, необходимого для размещения объектов
- •28. Понятие приоритета операций и его влияние на результаты вычислений
- •31.Флаги форматирования потоков ввода-вывода
- •32. Форматирование ввода-вывода с помощью манипуляторов
- •33.Форматирование ввода-вывода с помощью функций потоков ввода-вывода
- •34. Управление шириной поля вывода и выравниванием данных при выводе
- •35. Управление форматом вывода вещественных значений
- •36. Основные понятия структурного программирования
- •37. Базовый набор управляющих структур
- •39.Условная инструкция (if)
- •40. Инструкция множественного выбора (switch)
- •42. Цикл с постусловием (do while)
- •43. Итерационный цикл (for)
- •46. Инструкция перехода goto
- •47. Понятие рекуррентных вычислений, примеры
- •48. Понятие инварианта цикла
- •49. Понятие и определение массива
- •52. Ввод элементов массивов с клавиатуры
- •53. Декларативная и программная инициализация массивов
- •54. Копирование массивов
- •55. Нахождение минимальных и максимальных значений в массивах
- •56. Сдвиг элементов массивов
- •57. Перестановка элементов в массивах
- •58. Поиск данных в массивах
- •59. Сортировка данных в массивах
- •60. Вычисление сумм и произведений элементов массивов
- •61. Представление текстовых строк в виде массива символов
- •62. Ввод-вывод символьных строк
- •63. Определение фактической длины строки
- •64. Копирование символьных строк
- •65. Основные функции обработки строк библиотеки cstring
- •66. Массивы текстовых строк (двумерные массивы символов)
- •67. Указатели Понятие указателя
- •Работа с указателями
- •68. Арифметика указателей
- •69. Индексирование указателей
- •70. Ссылки
- •71. Определение функции
- •72. Инструкция return
- •73. Завершение работы функции
- •74. Механизмы передачи данных через параметры функций
- •75. Передача данных по значению
- •76. Передача данных через указатели
- •77. Передача данных по ссылке
- •78. Параметры по умолчанию
- •79. Функции с переменным числом параметров
- •80. Inline функции
- •81. Перегрузка функций
- •82. Рекурсия
- •83. Прототипы функций
60. Вычисление сумм и произведений элементов массивов
61. Представление текстовых строк в виде массива символов
В языке 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 в данном случае не используются.
Строка 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 символов предсказать невозможно.
62. Ввод-вывод символьных строк
Ввод текстовых строк с клавиатуры
Вывод текстовых строк на экран сложностей не вызывает:
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, ‘,’);