Класс string

 

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

#include < iostream>

#include < string.h>

char inBuf[ 1024 ];

try

{

while ( cin >> inBuf ) {

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

strcpy( str, inBuf );

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

delete [] str;

}

}

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

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

#include < iostream>

#include < string.h>

string str;

while ( cin > str )

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

 

При использовании класса 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 );

}