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

Анализ: В строке 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

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

2: #include

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

2: #include

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 предлагает набор встроенных функций-членов и переменных-членов, а также методов доступа, которые позволяют автоматически решать многие задачи, связанные с обработкой текстовых строк, получая команды от пользователя.

Перейти на страницу:

Похожие книги

Сущность технологии СОМ. Библиотека программиста
Сущность технологии СОМ. Библиотека программиста

В этой книге СОМ исследуется с точки зрения разработчика C++. Написанная ведущим специалистом по модели компонентных объектов СОМ, она раскрывает сущность СОМ, помогая разработчикам правильно понять не только методы модели программирования СОМ, но и ее основу. Понимание мотивов создания СОМ и ее аспектов, касающихся распределенных систем, чрезвычайно важно для тех разработчиков, которые желают пойти дальше простейших приложений СОМ и стать по-настоящему эффективными СОМ-программистами. Показывая, почему СОМ для распределенных систем (Distributed СОМ) работает именно так, а не иначе, Дон Бокс дает вам возможность применять эту модель творчески и эффективно для ежедневных задач программирования.

Дональд Бокс

Программирование, программы, базы данных / Программирование / Книги по IT