С++ для начинающих




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


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

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():

word.erase(pos,1);

Первый аргумент этой функции означает позицию подстроки, а второй – ее длину. Мы удаляем один символ, находящийся в позиции pos. Второй аргумент является необязательным; если его опустить, будут удалены все символы от pos до конца строки.

Вот полный текст функции filter_text(). Она имеет два параметра: указатель на вектор строк, содержащий текст, и строку с символами, которые нужно убрать.

void

filter_text( vector<string> *words, string filter )

{

    vector<string>::iterator iter = words->begin();

    vector<string>::iterator iter_end = words->end();

    // Если filter не задан, зададим его сами

    if ( ! filter.size() )

        filter.insert( 0, "\".," );

    while ( iter != iter_end ) {

        string::size_type pos = 0;

        // удалим каждый найденный элемент

        while (( pos =  (*iter).find_first_of( filter, pos ))

                    != string::npos )

            (*iter).erase(pos,1);




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