Выбрать главу

++word_pos; prev_pos = ++pos;

}

// обработаем последнее слово

words-push_back(

textline.substr( prev_pos, pos - prev_pos ));

locations-push_back(

make_pair( line_pos, word_pos ));

}

return new text_loc( words, locations );

}

Теперь функция main()выглядит следующим образом:

int main()

{

vectorstring *text_file = retrieve_text();

text_loc *text_locations = separate_words( text_file );

// ...

}

Вот часть распечатки, выданной тестовой версией separate_words():

textline: Alice Emma has long flowing red hair. Her Daddy

says

eoclass="underline" 52 pos: 5 line: 0 word: 0 substring: Alice

eoclass="underline" 52 pos: 10 line: 0 word: 1 substring: Emma

eoclass="underline" 52 pos: 14 line: 0 word: 2 substring: has

eoclass="underline" 52 pos: 19 line: 0 word: 3 substring: long

eoclass="underline" 52 pos: 27 line: 0 word: 4 substring: flowing

eoclass="underline" 52 pos: 31 line: 0 word: 5 substring: red

eoclass="underline" 52 pos: 37 line: 0 word: 6 substring: hair.

eoclass="underline" 52 pos: 41 line: 0 word: 7 substring: Her

eoclass="underline" 52 pos: 47 line: 0 word: 8 substring: Daddy

last word on line substring: says

...

textline: magical but untamed. "Daddy, shush, there is no

such thing,"

eoclass="underline" 60 pos: 7 line: 3 word: 0 substring: magical

eoclass="underline" 60 pos: 11 line: 3 word: 1 substring: but

eoclass="underline" 60 pos: 20 line: 3 word: 2 substring: untamed

eoclass="underline" 60 pos: 28 line: 3 word: 3 substring: "Daddy,

eoclass="underline" 60 pos: 35 line: 3 word: 4 substring: shush,

eoclass="underline" 60 pos: 41 line: 3 word: 5 substring: there

eoclass="underline" 60 pos: 44 line: 3 word: 6 substring: is

eoclass="underline" 60 pos: 47 line: 3 word: 7 substring: no

eoclass="underline" 60 pos: 52 line: 3 word: 8 substring: such

last word on line substring: thing,":

...

textline: Shy1y, she asks, "I mean, Daddy: is there?"

eoclass="underline" 43 pos: 6 line: 5 word: 0 substring: Shyly,

eoclass="underline" 43 pos: 10 line: 5 word: 1 substring: she

eoclass="underline" 43 pos: 16 line: 5 word: 2 substring: asks,

eoclass="underline" 43 pos: 19 line: 5 word: 3 substring: "I

eoclass="underline" 43 pos: 25 line: 5 word: 4 substring: mean,

eoclass="underline" 43 pos: 32 line: 5 word: 5 substring: Daddy,

eoclass="underline" 43 pos: 35 line: 5 word: 6 substring: is

last word on line substring: there?":

Прежде чем продолжить реализацию поисковой системы, вкратце рассмотрим оставшиеся функции-члены класса string, предназначенные для поиска. Функция rfind() ищет последнее, т.е. самое правое, вхождение указанной подстроки:

string river( "Mississippi" );

string::size_type first_pos = river.find( "is" );

string::size_type 1ast_pos = river.rfind( "is" );

find() вернет 1, указывая позицию первого вхождения подстроки "is", а rfind() – 4 (позиция последнего вхождения "is").

find_first_not_of() ищет первый символ, не содержащийся в строке, переданной как параметр. Например, чтобы найти первый символ, не являющийся цифрой, можно написать:

string elems( "0123456789" );

string dept_code( "03714p3" );

// возвращается позиция символа 'p'

string::size_type pos = dept_code.find_first_not_of(elems) ;

find_last_of() ищет последнее вхождение одного из указанных символов. find_last_not_of() – последний символ, не совпадающий ни с одним из заданных. Все эти функции имеют второй необязательный параметр – позицию в исходной строке, с которой начинается поиск.

Упражнение 6.13

Напишите программу, которая ищет в строке

"ab2c3d7R4E6"

цифры, а затем буквы, используя сначала find_first_of(), а потом find_first_not_of().

Упражнение 6.14

Напишите программу, которая подсчитывает все слова и определяет самое длинное и самое короткое из них в строке sentence:

string linel = "We were her pride of 10 she named us --";

string line2 = "Benjamin, Phoenix, the Prodigal"

string line3 = "and perspicacious pacific Suzanne";

string sentence = linel + line2 + line3;

Если несколько слов имеют длину, равную максимальной или минимальной, учтите их все.

6.9. Обрабатываем знаки препинания

После того как мы разбили каждую строку на слова, необходимо избавиться от знаков препинания. Пока из строки

magical but untamed. "Daddy, shush, there is no such thing,"

у нас получился такой набор слов:

magical

but

untamed.

"Daddy,

shush,

there

is

no

such

thing,"

Как нам теперь удалить ненужные знаки препинания? Для начала определим строку, содержащую все символы, которые мы хотим удалить:

string filt_elems( "\",.;:!?)(\\/" );

(Обратная косая черта указывает на то, что следующий за ней символ должен в данном контексте восприниматься буквально, а не как специальная величина. Так, \" обозначает символ двойной кавычки, а не конец строки, а \\ – символ обратной косой черты.)

Теперь можно применить функцию-член find_first_of() для поиска всех вхождений нежелательных символов:

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

!= string::npos )

Найденный символ удаляется с помощью функции-члена erase():