Язык программирования C++. Вводный курс


         

вместо размера массива передается размер


}

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

$ a.out

The winter of our discontent

The

win

ter

of

our

dis

con

ten

t

Функции setw()

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

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

while ( cin >> setw(sizeof( *pbuf )) >> pbuf )

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

*pbuf

дает только один символ, т.е. объект типа char. Поэтому setw()

передается значение 1. На каждой итерации цикла while в массив, на который указывает pbuf, помещается только нулевой символ. До чтения из стандартного ввода дело так и не доходит, программа зацикливается.

При использовании класса string все проблемы управления памятью исчезают, об этом заботится сам string. Вот как выглядит наша программа в данном случае:











#include <iostream.h>

#include <string>

int main()

{

           string buf, largest;

           // для хранения статистики

           int curLen,   // длина текущего слова

               max = -1, // максимальная длина слова

               cnt = 0;  // счетчик прочитанных слов

           while ( cin >> buf )

           {

                  curLen = buf.size();

                  ++cnt;

                  // новое самое длинное слово? сохраним его

                  if ( curLen > max )

                  {

              max = curLen;

              largest = buf;

                  }

           }

           cout << "Число прочитанных слов " << cnt << endl;

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

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



}

Однако запятая и кавычка по-прежнему считаются частью слова. Напишем функцию для удаления этих символов из слова:











#include <string>

void filter_string( string &str )

{

     // элементы, подлежащие фильтрации

     string filt_elems( "\",?." );

     string::size_type pos = 0;

     while (( pos = str.find_first_of( filt_elems, pos ))

                  != string::npos )

                  str.erase( pos, 1 );

<

Содержание  Назад  Вперед