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

Строковые константы

Вы можете инициализировать строку постоянным значением при ее определе- нии. Вот пример STRINIT, в котором это сделано (будем надеяться, что Александр Сергеевич не обидится на такое использование его стихов):

// strinit.cpp // инициализация строки #include <iostream> using namespace std; ///////////////////////////////////////////////////////////

int main ( ) {

char str [ ] = "Я памятник себе воздвиг нерукотворный."; cout << str << endl;

return 0;

}

Здесь строковая константа записана как нормальная фраза, ограниченная ка- вычками. Это может показаться необычным, так как строка — это массив типа char. В последнем примере мы видели, что массив инициализируется рядом зна- чений, заключенных в скобки и разделенных запятыми. Почему переменная str не инициализирована так же? В действительности вы можете использовать та- кую последовательность символьных констант:

char str [ ] = { 'Я', ' ', ' п', 'а', ' м', 'я', 'т', 'н', 'и', 'к', ' ', 'с', 'е', 'б', 'е'

и т. д. К счастью, разработчики C++ (и С) сжалились над нами и предоставили нам упрощенный подход, показанный в программе STRINIT. Эффект тот же са- мый: символы помещаются один за другим в массив. Как во всех строках, по- следним символом будет нулевой.

Чтение внутренних пробелов

Если вы введете в программе STRINGIN строку, содержащую больше одного слова, то вы будете неприятно удивлены. Вот пример:

Введите строку: Идет бычок, качается, вздыхает на ходу. Вы ввели: Идет

Куда же делся остаток фразы? Оказывается, что операция >> считает пробел нулевым символом. Таким образом, он считывает строки, состоящие из одного слова, и что-либо, напечатанное после пробела, отбрасывается.

Для считывания строк, содержащих пробелы, мы используем другой метод — cin.get(). Этот синтаксис означает использовать метод get() класса stream для его объекта cin. В следующем примере, BLANKSIN, показано, как это работает.

// blanksin.cpp // ввод строки с пробелами #include <iostream> using namespace std; ///////////////////////////////////////////////////////////

int main ( )

{

const int MAX = 80; // максимальная длина строки char str [ MAX ]; // сама строка

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

cin.get ( str, MAX );

cout << "Вы ввели: " << str << endl;

return 0;

}

Первый аргумент метода cin.get() — это адрес массива, куда будет помещена введенная строка. Второй аргумент определяет максимальный размер массива, автоматически предупреждая, таким образом, его переполнение.

При использовании этого метода введенная строка сохранится полностью.

Введите строку: Что посеешь, то и пожнешь. Вы ввели: Что посеешь, то и пожнешь.

Проблемы могут возникнуть, если вы перепутаете метод cin.get() с операция- ми cin и >>. Мы обсудим использование метода ignore() класса cin для устране- ния этой проблемы в главе 12 «Потоки и файлы».

 

20