Задание 2 . Класс string
Каждому студенту рекомендуется выполнить хотя бы одно из упражнений 1-12 задания 3 из параграфа 1.6, использую класс string.
В С++ описан стандартный класс string, который обеспечивает различные операции для манипулирования строками. Данный класс описывается в заголовочном файле cstring.h.
В классе string имеется несколько конструкторов. Ниаболее употребляемыми из них явлются конструктор, создающий пустую строку - string () и конструктор, создающий строку со значением С-строки - string (const char*).
Например,
string S1, S2; // создали два объекта класса string – пустые строки
string S3 (“Hello!!!”);// создали объект класса string – строку со значение “Hello!!!”
Класс содежит три операции присваивания:
string& opertor=(const srting& str); // присваивание объекта-строка
string& opertor=(const char *str);// присваивание значения С-строки
string& opertor=(char s);// присваивание значения символа
Например,
string S4=S3, S5= “Error”, S6= ‘a’;
В классе string опрделена константа NPOS, задающая максимально возможное число, которое в зависимости от конекста означет либо «все элементы строки», либо отрицательный результат поиска.
В классе переопредлены следющие операции
Опреция | Значение |
= | присваивание |
+ | конкантенация |
== (!=) | равенство(неравенство) |
< (<=) | меньше (меньше или равно) |
> (>=) | больше (больше или равно) |
[ ] | индексация |
<< (>>) | вывод(ввод) |
+= | добавление |
Пример 1. Ввести с клавиатуры два слова. Если они одинаковы, то вывести на экран их первый символ, в противном случае вывести строку, состоящую из этих слов, разделенных пробелом.
# include <iostream.h>
# include <cstring.h>
void main()
{
int k,k1;
string s1,s2;// описали два объекта класса string
cin>>s1>>s2; // считали две слова
if (s1!=s2) // использовали функцию != (не равно)
// класса string
{
string s3=s1+" "+s2+"\n"; //конкатенация строк класса //string для создания новой строки
cout<<s3;
}
else cout<<"First = "<<s1[0];
}
Опишем наиболее используемые методы класса string.
Метод size_type[1] size() const и метод size_type length() const возвращают размер строки.
Метод insert (size_type posl, const string & str) вставляет строку str в вызывающую строку, начиная с позиции posl.
Метод replace (size_type posl, size_type n1, const string & str)заменяет n1 элементов, начиная с позиции pos1 вызывающей строки, элементами строки str.
Методstring substr (size_type pos=0, size_type n=NPOS) constвозвращает подстроку длины n, назиная с позиции pos.
Метод size_type find (const string& str, size_type pos=0) const / size_type rfind (const string& str, size_type pos=0) constищет самое левое/правое вхождение строки str в вызывающую строку, начиная с позиции pos, и возвращает позицию вхождения или NPOS, если вхождение не найдено.
Метод size_type find (char с, size_type pos=0) const / size_type find (char с, size_type pos=0) constищет самое левое/ правое вхождение символа с в вызывающую строку, начиная с позиции pos, и возвращает позицию вхождения или NPOS, если вхождение не найдено.
Метод size_type find_first_of (const string& str, size_type pos=0) const/ size_type find_last_of (const string& str, size_type pos=0) constищет самое левое/ правое вхождение любого символа строки str в вызывающую строку, начиная с позиции pos, и возвращает позицию вхождения или NPOS, если вхождение не найдено.
Метод swap (const string& str)обменивает содрежимое вызывающей строки и строи str.
Метод erase (size_type pos=0, size_type n= NPOS)удаляет n элементов, начиная с позиции pos.
Метод clear ()ощищает всю строку.
Метод size_type copy (char * s, size_type n, size_type pos=0) constкопирует в символьный массив s n элементов вызывающей строки, начиная с позиции pos. Возращается количество скопированных элементов.
Пример 2. Решим задачу из примера 6.3., использую класс string. Вывести слова введенной строки, начинающиеся с гласной буквы, на экран столбиком, без разделительных знаков (пробел, табуляция, точка, запятая и т.п.).
void main ()
{
string s,s1,*s2;//Cоздали два объекта класса
//string и указатель на объект классса string
int k=0;
string razd=" ,.:";
/*Создали объект класса string, с помощью конструктора копирования для хранения разделителей между словами */
string glas="aeoiuy";
/*Создали объект класса string, с помощью конструктора копирования для хранения гласных*/
cout<<"Enter string ";
getline(cin,s);//Считали строку из потока cin
s2=new string [s.length()/2];//Выделили память под
//массив строк
s1=s;
/* Скопировали строку s в строку s1 с помощью переопредленной операции = */
int n= s1.find_first_of(razd);
/*Нашли позицию первого разделителя в строке s1*/
while (n!=NPOS)
{
if (n)
{
s2[k]=s1.substr(0,n);
/*Сохранили подстроку до разделителя как очередной элемент массива */
if (glas.find(s2[k][0])!=NPOS)cout<<"\n"<<s2[k];
k++;
}
s1=s1.substr(n+1);
/*Далее рассматриваем только оставшуюся часть строки*/
n=s1.find_first_of(razd);//Нашли позицию очередного
//разделителя
}
s2[k]=s1; //Обработка последнего слова
if (glas.find(s2[k][0])!=NPOS)cout<<"\n"<<s2[k];
}
Отметим, что в данном решении задачи, так же как и в решении задачи в примере 6.3. массив слов введен лишь для демонстрации возможности сохранения слов в массиве для дальнейшей обработки. Однако, в данной задачи не предполагается дальнейшая обработка выделенных из строки слов, поэтому нет необходимости сохранять их в массиве. Поэтому целесообразнее не определять массив строк string *s2, а определить лишь одну строку string s2, которую и использовать для обработки очередного выделенного слова.
Дата добавления: 2015-10-09; просмотров: 788;