Освой самостоятельно С++ за 21 день.
Шрифт:
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 осуществляется вызов
Функции 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 введетданные за пределы массива.
Чтобы предупредить подобную ошибку, в этой библиотеке функций содержится еще одна функция копирования строк: strncpy. Эта функция копирует ряд символов, не превышающий длины строки, заданной в целевом массиве. Функция strncpy также прерывает копирование, если ей повстречается символ разрыва строки. Использование функции strncpy показано в листинге 12.11.
Листинг 12.11. Использование функции strncpy
1: #include <iostream.h>
2: #include <string.h>
3: int main
4: {
5: const int MaxLength = 80;
6: char String1[] = "No man is an island";
7: char String2[MaxLength+1];
8:
9:
10: strncpy(String2,String1,MaxLength);
11:
12: cout << "String1: " << String1 << endl;
13: cout << "String2: " << String2 << endl;
14: return 0;
15: }
Результат:
String1: No man is an island
String2: No man is an island
Анализ:
В строке 10 программа вместо функции strcpy используется функцию strncpy, третий параметр MaxLength которой задает максимальную длину копируемой строки. Размер массива String2 задан как MaxLength+1. Дополнительный элемент потребовался для концевого нулевого символа строки, который добавляется автоматически обеими функциями — strcpy и strncpy.Классы строк
Многие компиляторы C++ содержат библиотеки классов, с помощью которых можно решать различные прикладные задачи. Одним из представителей встроенных классов является класс String.
Язык C++ унаследовал от С концевой нулевой символ окончания строки и библиотеку строковых функций, куда входит функция strcpy. Но все эти функции нельзя использовать в объектно-ориентированном программировании. Класс String предлагает набор встроенных функций-членов и переменных-членов, а также методов доступа, которые позволяют автоматически решать многие задачи, связанные с обработкой текстовых строк, получая команды от пользователя.
Если в вашем компиляторе нет встроенного класса String, а иногда и в тех случаях, когда он есть, бывает необходимо создать собственный класс работы со строками. Далее в этой главе рассматривается процедура создания и применения класса String и пользовательских классов работы со строками.
Как минимум, класс String должен преодолеть ограничения, свойственные использованию массивов символов. Подобно другим массивам, массивы символов статичны. Вам приходится задавать их размер при объявлении или инициализации. Они всегда занимают все отведенное для них пространство памяти, даже если вы используете только по- ловину элементов массива. Запись данных за пределы массива ведет к катастрофе.
Хорошо написанный класс работы со строковыми данными выделяет столько памяти, сколько необходимо для текущего сеанса работы с программой, и всегда предусматривает возможность добавления новых данных. Если с выделением дополнительной памяти возникнут проблемы, предусмотрены элегантные пути их решения. Первый пример использования класса String показан в листинге 12.12.
Листинг 12.12. Использование класса String
1: // Листинг. 12.12
2:
3: #include <iostream.h>
4: #include <string.h>
5:
6: // Рудиментарный класс string
7: class String
8: {
9: public:
10: // Конструкторы
11: String
12: Stnng(const char *const),
13: Stnng(const String &),
14: ~Stnng
15:
16: // Перегруженные операторы
17: char & operator[](unsigned short offset),
18: char operator[](unsigned short offset) const,
19: Stnng operator+(const String&),
20: void operator+=(const String&)
21: Stnng & operator= (const Stnng &),
22:
23: // Основные методы доступа
24: unsigned short GetLenconst { return itsLen, }
25: const char * GetStnng const { return itsStnng, }
26:
27: private:
28: Stnng (unsigned short), // Закрытый конструктор