Класс 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 );
}