vector<string> vec; // Массив для хранения слов
int CurBeg = 0;// Позиция начала строки на текущей итерации
while(1)
{ // Пропускаем все разделители перед началом текущего слова
while(s.find_first_of(delim,CurBeg)==CurBeg)
++CurBeg;
// Помещаем в массив позцию начала текущего слова
WordBegPos.push_back(CurBeg);
//Позиция, следующая за последним символом текущего слова
int CurFin = s.find_first_of(delim,CurBeg);
if(CurFin == string::npos)// Условие выхода из цикла
{// Определяем длину последнего слова и заносим ее в массив
WordLength.push_back(s.size()-CurBeg);
break;
}
// Определяем длину текущего слова и заносим ее в массив
WordLength.push_back(CurFin-CurBeg);
CurBeg = CurFin+1;// Определяем позицию, с которой
// начнется следующая итерация
}
//Нулевая длина последнего слова говорит о наличии разделителей
// в конце строки
if(WordLength.back() == 0)
{ WordBegPos.pop_back(); WordLength.pop_back();// Удаляем
// записи о них
}
//Заносим слова в массив vec
for(unsigned int i = 0; i<WordBegPos.size();++i)
{ vec.push_back(s.substr(WordBegPos[i],WordLength[i]));
}
return vec;
}
void main()
{ setlocale(LC_ALL,"rus_rus.1251");
string s1(" И/дым: отечества, нам сладок и приятен!++");// Исходная
// строка
string s2(": ,/!++ ");// Символы разделители
cout<<"Исходная строка:\""<<s1<<"\"";
vector<string> v;
v = vtok(s1,s2);// Вызов фукции
cout<<endl<<"В исходной строке "<< v.size()<<" слов"<<endl;
for(unsigned int i=0;i<v.size();i++)
cout<<"\""<<v[i]<< "\""<<endl;
}
Результат
Аналогичен примеру 9.
Анализ
В этом примере функция vtok( )имеет два формальных парметра: ссылку на исходную строку s и ссылку на строку delim, содержащую символы разделители. Возвращает эта функция вектор, элементами которого служат отдельные слова исходной строки.
Вариант 1
Удалить из строки все комментарии вида /*….*/ и //….
Вариант 2
Дана строка, в которой слова разделены одним пробелом. Напечатать все слова, отличные от слова hello.
Вариант 3
Дана строка, в которой слова разделены одним пробелом. Напечатать то слово, которое по алфавиту предшествует всем другим словам (все слова различны; слово ааа предшествует слову аааа).
Вариант 4
Дана строка, в которой слова разделены одним пробелом. Напечатать все слова, содержащие ровно две буквы d.
Вариант 5
Дана строка, в которой слова разделены одним пробелом. Напечатать текст, составленный из последних символов всех слов строки.
Вариант 6
Дана строка, в которой слова разделены одним пробелом и более. Напечатать их в алфавитном порядке.
Вариант 7
Дана строка из строчных русских букв (не более 50). Напечатать измененную строку, где после каждого фрагмента «город» добавлен фрагмент текста «пригород». Фрагменты разделены пробелами.
Вариант 8
Дана строка, в которой слова разделены одним пробелом. Удалить из нее все повторяющиеся слова.
Вариант 9
Дана строка, в которой слова разделены одним пробелом. Напечатать слово максимальной длины, в котором нет символов цифр (считается, что такое слово только одно).
Вариант 10
Дана строка, в которой слова разделены одним пробелом. В каждом слове перенести первую букву в конец слова. Длина строки при этом не должна изменяться, и слова по-прежнему должны быть разделены пробелами.
Вариант 11
Дана строка, в которой слова разделены следующими символами: ,:/+. Если слово нечетной длины, то удалить его среднюю букву.
Вариант 12
Дана строка из цифр и букв латинского алфавита. Найти цифры, обладающие минимальным и максимальным значением.
Вариант 13
Дана строка из цифр и букв латинского алфавита. Вывести сумму всех цифр.
Вариант 14
Дана строка из цифр и букв латинского алфавита в произвольном порядке. Вывести номер позиции, которая содержит символ ‘5’, при условии, что этот символ окружен буквами.
Вариант 15
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.