Чтение онлайн

на главную - закладки

Жанры

Освой самостоятельно С++ за 21 день.

Либерти Джесс

Шрифт:

Но в C++ строку можно представить как массив символов, заканчивающийся кон- цевьш нулевым символом строки. Такой массив можно объявить и инициализировать точно так же, как любой другой массив, например:

char Greeting[ ] = { 'H' , 'e' , ' 1' , 'Г , 'o' , ' ' , 'W' , 'o' , 1 r' , '1' , 'd' , 1 \0' };

В последний элемент массива заносится нулевой концевой символ строки (\0), который многие функции C++ распознают как символ разрыва строки. Хотя метод ввода строки текста в массив символ за символом работает нормально, это

довольно утомительная процедура, чреватая ошибками. К счастью, C++ допускает упрощенный метод ввода строк текста в массивы:

char Greeting[] = "hello world";

Обратите внимание на два момента данного синтаксиса.

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

• Нет необходимости добавлять концевой нулевой символ, так как компилятор сделает это автоматически.

Строка Hello World займет 12 байт. Пять байтов пойдет на слово Hello, пять на слово World и по одному байту на пробел и концевой нулевой символ.

Инициализацию строкового массива можно оставить на потом. При этом, также как и с другими массивами, нужно следить, чтобы затем в массив не было записано символов больше, чем отводилось для этого места.

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

Листинг 12.8. Заполнение массива символами

1: //Листинг 12.8. Заполнение массива символами

2:

3: #include <iostream.h>

4:

5: int main

6: {

7: char buffer[80];

8: cout << "Enter the string: ";

9: cin >> buffer;

10: cout << "Here is' the buffer: " << buffer << endl;

11: return 0;

12: }

Результат:

Enter the string: Hello World

Here's the buffer: Hello

Анализ: В строке 7 объявляется массив buffer, рассчитанный на 80 символов. Taкой массив может содержать строку из 79 букв, включая пробелы, плюс нулевой концевой символ строки.

В строке 8 пользователю предлагается ввести строку текста, которая копируется в массив buffer в строке 9. Метод cin автоматически добавит нулевой концевой символ в конце введенной строки.

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

Чтобы решить эти проблемы, нужно использовать метод get, применяемый вместе с оператором cin: cin,get. Для выполнения метода нужно задать

три параметра.

• Буфер ввода.

• Максимальное число символов.

• Разделительный символ прерывания ввода.

По умолчанию в качестве разделительного задается символ разрыва строки. Использование этого метода показано в листинге 12.9.

Листинг 12.9. Заполнение массива

1: //Листинг 12.9. Использование метода cin.get

2:

3: #include <iostream.h>

4:

5: int main

6: {

7: char buffer[80];

8: cout << "Enter the string: ";

9: cin.get(buffer, 79); // ввод завершается после 79 символа или символа разрыва строки

10: cout << "Here's the buffer: " << buffer << endl;

11: return 0;

12: }

Результат:

Enter the string: Hello World

Here's the buffer: Hello World

Анализ: В строке 9 осуществляется вызов метода cin.get. Буфер ввода, заданный в строке 7, передается в функцию как первый аргумент. Второй аргумент задает максимальную длину строки, равную 79 символам. Допускается ввод только 79 символов, поскольку последний элемент массива отводится на концевой нулевой символ строки. Устанавливать третий аргумент не обязательно. В большинстве случаев в качестве разделительного символа подходит задаваемый по умолчанию символ разрыва строки.

Функции strcpy и strncpy

Язык C++ унаследовал от С библиотечные функции, выполняющие операции над строками. Среди множества доступных функций есть две, которые осуществляют копирование одной строки в другую. Это функции strcpy и strncpy. Функция strcpy копирует строку целиком в указанный буфер, как показано в листинге 12.10.

Листинг 12.10. Использование функции strcpy

1: #include <iostream.h>

2: #include <string.h>

3: int main

4: {

5: char String1[] = "No man is an island";

6: char String2[80];

7:

8: strcpy(String2,String1);

9:

10: cout << "String1: " << String1 << endl;

11: cout << "String2: " << String2 << endl;

12: return 0;

13: }

Результат:

String1: No man is an island

String2: No man is an island

Анализ: Файл заголовка string.h включается в программу в строке 2. Этот файл содержит прототип функции strcpy. В качестве аргументов функции указываются два массива символов, первый из которых является целевым, а второй — массивом источника данных. Если массив-источник окажется больше целевого массива, то функция strcpy введетданные за пределы массива.

Поделиться:
Популярные книги

Безумный Макс. Ротмистр Империи

Ланцов Михаил Алексеевич
2. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
4.67
рейтинг книги
Безумный Макс. Ротмистр Империи

Пистоль и шпага

Дроздов Анатолий Федорович
2. Штуцер и тесак
Фантастика:
альтернативная история
8.28
рейтинг книги
Пистоль и шпага

Черный маг императора 2

Герда Александр
2. Черный маг императора
Фантастика:
юмористическая фантастика
попаданцы
аниме
6.00
рейтинг книги
Черный маг императора 2

Я еще князь. Книга XX

Дрейк Сириус
20. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я еще князь. Книга XX

Адвокат вольного города 4

Кулабухов Тимофей
4. Адвокат
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Адвокат вольного города 4

Идеальный мир для Лекаря 7

Сапфир Олег
7. Лекарь
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 7

Таблеточку, Ваше Темнейшество?

Алая Лира
Любовные романы:
любовно-фантастические романы
6.30
рейтинг книги
Таблеточку, Ваше Темнейшество?

Сила рода. Том 3

Вяч Павел
2. Претендент
Фантастика:
фэнтези
боевая фантастика
6.17
рейтинг книги
Сила рода. Том 3

Вторая невеста Драконьего Лорда. Дилогия

Огненная Любовь
Вторая невеста Драконьего Лорда
Любовные романы:
любовно-фантастические романы
5.60
рейтинг книги
Вторая невеста Драконьего Лорда. Дилогия

Новый Рал 5

Северный Лис
5. Рал!
Фантастика:
попаданцы
5.00
рейтинг книги
Новый Рал 5

Блуждающие огни 3

Панченко Андрей Алексеевич
3. Блуждающие огни
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
Блуждающие огни 3

Четвертый год

Каменистый Артем
3. Пограничная река
Фантастика:
фэнтези
9.22
рейтинг книги
Четвертый год

И вспыхнет пламя

Коллинз Сьюзен
2. Голодные игры
Фантастика:
социально-философская фантастика
боевая фантастика
9.44
рейтинг книги
И вспыхнет пламя

Вдова на выданье

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Вдова на выданье