|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Строки класса string. include <string>. using namespace std;. include <iostream>. include <string>. include <malloc.h>. using namespace std;. string s = Test;. s.insert (1,!);. cout << s.c_str() <&lСтроки класса string
В современном стандарте C++ определен класс с функциями и свойствами (переменными) для организации работы со строками (в классическом языке C строк как таковых нет, есть лишь массивы символов char): #include <string> Для работы со строками также нужно подключить стандартный namespace: using namespace std; В противном случае придётся везде указывать описатель класса std::string вместо string.
Ниже приводится пример программы, работающей со string (в старых си-совместимых компиляторах не работает!):
#include <iostream> #include <string> #include <malloc.h> using namespace std; int main () { string s = "Test"; s.insert (1,"!"); cout << s.c_str() << endl; string *s2 = new string("Hello"); s2->erase(s2->end()); cout << s2->c_str(); cin.get(); return 0; }
Основные возможности, которыми обладает класс string: · инициализация массивом символов (строкой встроенного типа) или другим объектом типа string. Встроенный тип не обладает второй возможностью; · копирование одной строки в другую. Для встроенного типа приходится использовать функцию strcpy(); · доступ к отдельным символам строки для чтения и записи. Во встроенном массиве для этого применяется операция взятия индекса или косвенная адресация с помощью указателя; · сравнение двух строк на равенство. Для встроенного типа используются функции семейства strcmp(); · конкатенация (сцепление) двух строк, дающая результат либо как третью строку, либо вместо одной из исходных. Для встроенного типа применяется функция strcat(), однако чтобы получить результат в новой строке, необходимо последовательно задействовать функции strcpy() и strcat(), а также позаботиться о выделении памяти; · встроенные средства определения длины строки (функции-члены класса size() и length()). Узнать длину строки встроенного типа можно только вычислением с помощью функции strlen(); · возможность узнать, пуста ли строка.
Рассмотрим эти базовые возможности более подробно. Инициализация строк при описании и длина строки (не включая завершающий нуль-терминатор): string st( "Моя строка\n" ); cout << "Длина " << st << ": " << st.size() << " символов, включая символ новой строки\n"; Строка может быть задана и пустой: string st2; Для проверки того, пуста ли строка, можно сравнить ее длину с 0: if ( ! st.size() ) // пустая или применить метод empty(), возвращающий true для пустой строки и false для непустой: if ( st.empty() ) // пустая Третья форма создания строки инициализирует объект типа string другим объектом того же типа: string st3( st ); Строка st3 инициализируется строкой st. Как мы можем убедиться, что эти строки совпадают? Воспользуемся оператором сравнения (==): if ( st == st3 ) // инициализация сработала Как скопировать одну строку в другую? С помощью обычной операции присваивания: st2 = st3; // копируем st3 в st2 Для сцепления строк используется операция сложения (+) или операция сложения с присваиванием (+=). Пусть даны две строки: string s1( "hello, " ); string s2( "world\n" ); Мы можем получить третью строку, состоящую из конкатенации первых двух, таким образом: string s3 = s1 + s2; Если же мы хотим добавить s2 в конец s1, мы должны написать: s1 += s2; Операция сложения может сцеплять объекты класса string не только между собой, но и со строками встроенного типа. Можно переписать пример, приведенный выше, так, чтобы специальные символы и знаки препинания представлялись встроенным типом char *, а значимые слова – объектами класса string: const char *pc = ", "; string s1( "hello" ); string s2( "world" ); string s3 = s1 + pc + s2 + "\n"; cout << endl << s3; Подобные выражения работают потому, что компилятор "знает", как автоматически преобразовывать объекты встроенного типа в объекты класса string. Возможно и простое присваивание встроенной строки объекту string: string s1; const char *pc = "a character array"; s1 = pc; // правильно Обратное преобразование при этом не работает. Попытка выполнить следующую инициализацию строки встроенного типа вызовет ошибку компиляции: char *str = s1; // ошибка компиляции Чтобы осуществить такое преобразование, необходимо явно вызвать функцию-член с названием c_str() ("строка Си"): const char *str = s1.c_str(); Функция c_str() возвращает указатель на символьный массив, содержащий строку объекта string в том виде, в каком она находилась бы во встроенном строковом типе.
К отдельным символам объекта типа string, как и встроенного типа, можно обращаться с помощью операции взятия индекса. Вот, например, фрагмент кода, заменяющего все точки символами подчеркивания: string str( "www.disney.com" ); int size = str.size(); for ( int i = 0; i < size; i++ ) if ( str[i] == '.' ) str[ i ] = '_'; cout << str;
Но лучше читать документацию по C++ и пользоваться его возможностями. Например, предыдущее действие мы могли бы выполнить вызовом одной-единственной функции replace(): replace( str.begin(), str.end(), '.', '_' ); Правда, здесь использован не метод replace класса string, а одноимённый алгоритм: #include <algorithm> Поскольку объект string ведет себя как контейнер, к нему могут применяться и другие алгоритмы. Это позволяет решать задачи, не решаемые напрямую функциями класса string.
Ниже приводится краткое описание основных операторов и функций класса string, ссылки в таблице ведут к русскоязычным описаниям в интернете. Более полный список возможностей класса string можно получить, например, в Википедии https://ru.wikipedia.org/wiki/String_(C%2B%2B) или на сайте cplusplus.com: http://www.cplusplus.com/reference/string/string/
Следует обратить внимание, что у любой функции класса string может быть несколько перегрузок - разновидностей с одинаковыми именами, отличающихся между собой списками и типами аргументов.
В качестве недостатков объекта string можно отметить следующее: · отсутствие в классе встроенных средств для разбора строк по набору разделителей (аналога функции strtok для строк char *); · возможное замедление быстродействия по отношению к char * при сложной обработке данных.
Задание к лабораторной работе 3. Ниже приведён код для разбора введённой с клавиатуры строки string на слова. Доработать код, исключив знаки препинания, стоящие последними символами строк vecstr[i], а также слова, не содержащие ни одного алфавитно-цифрового символа. #include <iostream> #include <sstream> #include <string> #include <vector> using namespace std;
int main() { cout << "Enter the string: "; string str; getline(cin, str);
vector <string> vecstr; string word; stringstream s(str);
while (s >> word) vecstr.push_back(word);
int vsize = vecstr.size(); for (int i = 0; i < vsize; i++) cout << vecstr[i] << endl;
cin.get(); return 0; }
При написании программы дополнительно использованы возможности стандартных классов vector (http://www.cplusplus.com/reference/vector/vector/) и stringstream (http://www.cplusplus.com/reference/sstream/stringstream/ )
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|