ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 7) онлайн

Строковые переменные

Как и другие типы данных, строки могут быть переменными и константами. Мы рассмотрим эти две сущности перед тем, как начать рассматривать более слож- ные строковые операции. Вот пример, в котором определена одна строковая пе- ременная. (В этом разделе мы будем предполагать, что слово строка означает строковый тип.) Программа просит пользователя ввести строку и помещает эту строку в строковую переменную, а затем выводит эту строку на дисплей. Листинг программы STRINGIN:

// stringin.cpp // простая переменная строка #include <iostream> using namespace std; ///////////////////////////////////////////////////////////

int main ( ) {

const int MAX = 80; // максимальный размер строки char str [ MAX ]; // сама строка

cout << "Введите строку: ";      // ввод строки

cin >> str;

cout << "Вы ввели: " << str << endl;// показ результата return 0;

}

Определение строковой переменной str выглядит похожим (да так оно и есть) на определение массива типа char:

char str [ MAX ];

Мы используем операцию >> для считывания строки с клавиатуры и поме- щения ее в строковую переменную str. Этой операции известно, как работать со строками: она понимает, что это массив символов. Если пользователь введет строку «Секретарь» (тот, кто копирует рукописи) в этой программе, то массив str будет выглядеть чем-то похожим на рис. 7.9.

Рис. 7.9. Строка, хранящаяся в строковой переменной

Каждый символ занимает 1 байт памяти. Важная деталь, касающаяся строк, состоит в том, что они должны завершаться байтом, содержащим 0. Это часто представляют символьной константой \0, код которой в ASCII равен 0. Завер- шающий ноль называется нулевым символом. Когда операция << выводит строку, то она выводит символы до тех пор, пока не встретит нулевой символ.

Как избежать переполнения буфера

Программа STRINGIN предлагает пользователю напечатать строку. Что случит- ся, если пользователь введет строку, которая окажется длиннее, чем массив, используемый для ее хранения? Как мы упомянули ранее, в C++ нет встроенно- го механизма, защищающего программу от помещения элементов за пределы массива. Поэтому слишком увлеченный пользователь может привести систему к краху.

Однако существует возможность ограничить при использовании операции >> количество символов, помещаемых в массив. Программа SAFETYIN демонстриру- ет этот подход.

// safetyin.cpp

// избежание переполнения буфера #include <iostream> #include  <iomanip> using namespace std; ///////////////////////////////////////////////////////////

int main ( ) {

const int MAX =20;         // максимальный размер строки

char str [ MAX ];              // сама строка

cout << "\nВведите строку: ";

 

cin >> setw ( MAX ) >> str; // ввод не более чем MAX символов cout << "Вы ввели: " << str << endl; return 0;

}

Эта программа использует метод setw, определяющий максимальное количе- ство символов, которое сможет принять буфер. Пользователь может напечатать больше символов, но операция >> не вставит их в массив. В действительности операция вставит в массив на один символ меньше, чем определено, так как в бу- фере есть место для завершающего нулевого символа. Таким образом, в програм- ме SAFETYIN максимальным числом возможных символов будет 19.

 

19