Программирование >>  Инициализация объектов класса, структура 

1 ... 342 343 344 [ 345 ] 346 347 348 ... 395


#include <iostream> #include <string.h>

char inBuf[ 1024 ] ;

while ( cin >> inBuf ) {

char *str = new char[ strlen( inBuf ) + 1 ]; strcpy( str, inBuf );

... сделать что-то с массивом символов str

delete [] str;

в эту память:

catch( ... ) { delete [] str; throw; }

#include <iostream> #include <string.h>

string str; while ( cin >> str )

Работать с типом string значительно проще:

... сделать что-то со строкой

Рассмотрим операторы ввода в С-строки и в объекты класса string. В качестве входного текста по-прежнему будет использоваться рассказ об Алисе Эмме:

Alice Emma has long flowing red hair. Her Daddy says when the wind blows through her hair, it looks almost alive, like a fiery bird in flight. A beautiful fiery bird, he tells her, magical but untamed. Daddy, shush, there is no such creature, she tells him, at the same wanting him to tell her more. Shyly, she asks, I mean, Daddy, is there?

time

Поместим этот текст в файл alice emma, а затем перенаправим на него стандартный вход программы. Позже, когда мы познакомимся с файловым вводом, мы откроем и прочтем этот файл непосредственно. Следующая программа помещает прочитанные со стандартного ввода слова в С-строку и находит самое длинное слово:

20.2.1. Строковый ввод

Счит1вание можно производить как в С-строки, так и в объекта: класса string. М1 рекомендуем пользоваться последними. Их главное преимущество - автоматическое управление памятью для хранения символов. Чтобы прочитать данные в С-строку, т.е. массив символов, необходимо сначала задать его размер, достаточный для хранения строки. Обычно мы читаем символы в буфер, затем выделяем из хипа ровно столько памяти, сколько нужно для хранения прочитанной строки, и копируем данные из буфера



#include <iostream.h> #include <string.h>

int main() {

const int bufSize = 24;

char buf[ bufSize ], largest[ bufSize ];

для хранения статистики int curLen, max = -1, cnt = 0; while ( cin >> buf )

curLen = strlen( buf ); ++cnt;

новое самое длинное слово? сохраним его if ( curLen > max ) {

max = curLen;

strcpy( largest, buf );

cout << Число прочитанн1х << endl;

<< cnt

cout << Дина самого длинного слова << max << endl;

cout << Самое длинное слово << largest << endl;

После компиляции и запуска программа выводит следующие сведения:

Число прочитанных слов 65 Длина самого длинного слова 10 Самое длинное слово creature,

На самом деле этот результат неправилен: самое длинное слово beautiful, в нем девять букв. Однако выбрано creature, потому что программа сочла его частью занятую и кавычку. Следовательно, необходимо отфильтровать небуквенные символы.

Но прежде чем заняться этим, рассмотрим программу внимательнее. В ней каждое слово помещается в массив buf, длина которого равна 24. Если бы в тексте попалось слово длиной 24 символа (или более), то буфер переполнился бы и программа, вероятно, закончилась бы крахом. Чтобы предотвратить переполнение входного массива, можно воспользоваться манипулятором setw(). Модифицируем предыдущую программу:

while ( cin >> setw( bufSize ) >> buf )

Здесь bufSize - размер массива символов buf. setw() разбивает строку длиной bufSize или больше на несколько строк, каждая из которых не длиннее, чем bufSize - 1.

Завершается такая частичная строка двоичным нулем. Для использования setw() в программу необходимо включить заголовочный файл iomanip:

#include <iomanip>

слов



#include <iostream> #include <iomanip>

int main()

const int bufSize = 24; char buf[ bufSize ]; char *pbuf = buf;

если строка длиннее, чем sizeof(char*), она разбивается на несколько строк

while ( cin >> setw( sizeof( pbuf )) >> pbuf ) cout << pbuf << endl;

Применение оператора sizeof в следующем примере дает неожиданный результат:

Программа печатает:

a.out

The winter of our discontent

The win

ter of

con ten

Функции setw () вместо размера массива передается размер указателя, длина которого на нашей машине равна четырем байтам, поэтому вывод разбит на строки по три символа.

Попытка исправить ошибку приводит к еще более серьезной проблеме:

while ( cin >> setw(sizeof( *pbuf )) >> pbuf ) Мы хотели передать setw() размер массива, адресуемого pbuf. Но выражение

*pbuf

дает только один символ, т.е. объект типа char. Поэтому setw() передается значение 1. На каждой итерации цикла while в массив, на который указывает pbuf, помещается

Если в объявлении массива buf размер явно не указан:

char buf[] = Нереастичн пример ;

то программист может применить оператор sizeof, но при условии, что идентификатор является именем массива и находится в области видимости выражения:

while ( cin >> setw(sizeof( buf )) >> buf )



1 ... 342 343 344 [ 345 ] 346 347 348 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика