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




Выделяем слова в строке


Нашей первой задачей является разбиение строки на слова. Мы будем вычленять слова, находя разделяющие их пробелы с помощью функции find(). Например, в строке

Alice Emma has long flowing red hair.

насчитывается шесть пробелов, следовательно, эта строка содержит семь слов.

Класс string имеет несколько функций поиска. find() – наиболее простая из них. Она ищет образец, заданный как параметр, и возвращает позицию его первого символа в строке, если он найден, или специальное значение string::npos в противном случае. Например:

#include <string>

#include <iostream>

int main() {

    string name( "AnnaBelle" );

    int pos = name.find( "Anna" );

    if ( pos == string::npos )

        cout << "Anna не найдено!\n";

    else cout << "Anna найдено в позиции: " << pos << endl;

}

Хотя позиция подстроки почти всегда имеет тип int, более правильное и переносимое объявление типа результата, возвращаемого find(), таково:

string::size_type

Например:

string::size_type pos = name.find( "Anna" );

Функция find() делает не совсем то, что нам надо. Требуемая функциональность обеспечивается функцией find_first_of(), которая возвращает позицию первого символа, соответствующего одному из заданных в строке-параметре. Вот как найти первый символ, являющийся цифрой:

#include <string>

#include <iostream>

int main() {

    string numerics( "0123456789" );

    string name( "r2d2" );

    string:: size_type pos = name.find_first_of( numerics );

    cout << "найдена цифра в позиции: "

         << pos       << "\tэлемент равен "

         << name[pos] << endl;

}

В этом примере pos получает значение 1 (напоминаем, что символы строки нумеруются с 0).

Но нам нужно найти все вхождения символа, а не только первое. Такая возможность реализуется передачей функции find_first_of() второго параметра, указывающего позицию, с которой начать поиск. Изменим предыдущий пример. Можете ли вы сказать, что в нем все еще не вполне удовлетворительно?




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