
Тип данных string стандартной библиотеки
Тип данных string стандартной библиотеки лишен этих недостатков, но может проигрывать массивам символов в эффективности. Основные действия со строками выполняются в нем с помощью операций и методов, а длина строки изменяется динамически в соответствии с потребностями. Для использования класса необходимо подключить к программе заголовочный файл <string>.
Рассмотрим пример:
#include <cstring>
#include <string>
#include <iostream>
using namespace std;
int main ()
{
char c1[80], c2[80], c3[80];
// Строки с завершающим нулем
string s1, s2, s3;
// Присваивание строк
strcpy(c1, "old string one");
strcpy(c2, c1);
s1 = "new string one";
s2 = s1;
// Конкатенация строк
strcpy(c3, c1);
strcpy(c3, c2);
s3 = s1 + s2;
// Сравнение строк
if (strcmp(c2, c3) < 0 ) cout<<c2<<endl;
else cout<<c3<<endl;
if (s2<s3) cout<<s2<<endl;
else cout<<s3<<endl;
return 0;
}
Как видно из примера, выполнение любых действий со строками старого стиля требует использования функций и менее наглядно. Кроме того, необходимо проверять, достаточно ли места в строке-приемнике при копировании, то есть фактически код работы со строками старого стиля должен быть еще более длинным.
Строки типа string защищены от выхода информации за их границы и с ними можно работать так же, как с любым встроенным типом данных, то есть с помощью операций. (Учебник, страница 286)
Вот пример использования:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s0 = "abcde"; string s1 = " fg";
// Конкатенация строк
string s = s0 + s1; cout<<s<<"\n";
// Получаем символ на определенном месте.
char ch0=s0.at(1); cout<<ch0<<"\n";
char ch1 = s0[3]; cout<<ch1<<"\n";
// Выясняем, не пустая ли строка
if (s0.empty()) cout << "String is empty"<<"\n";
else cout << "String isn't empty"<<"\n";
// Обмен значения двух строк.
swap(s0, s1);
// Присваиваем и сравниваем 2 строки.
s1 = s0;
if(s1 == s0) cout << "Strings are equal"<<"\n";
else cout << "Strings are not equal"<<"\n";
// Чтение введенной с клавиатуры строки.
getline(cin, s1); cout<<s1<<" ";
// Получение длины строки.
cout<<s1.length();
}
Как вы видите, работать со строками через класс string достаточно удобно - вы можете выполнять конкатенацию (сложение) строк с помощью обычного оператора +, можете брать символ в определенном месте строки с помощью оператора [] (или другим способом - с помощью метода at), можете использовать привычные операторы =, = =, != для присваивания и сравнения строк.
Также имеются методы для получения длины строки, для выяснения, не пустая ли это строка и др.
Обратите внимание также на весьма полезный метод getline, который позволяет прочитать строку из определенного потока (с клавиатуры в нашем примере).
Две строки равны, если:
Их размер одинаков, и каждый символ в позиции i одной строки равен символу в позиции i в другой строке.
Операторы |
складывают строки, присваивают строкам значение, вводят/выводят строки, сравнивают строки |
append |
добавляет строку или символы к строке |
assign |
присваивает строке значение строк символов или других строк C++ |
at |
возвращает символ, стоящий в некоторой позиции |
begin |
возвращает итератор на начало строки |
c_str |
возвращает строку в виде немодифицируемого массива символов (как в C) |
capacity |
возвращает количество символов, которые могут поместиться в строку |
clear |
удаляет все символы из строки |
compare |
сравнивает две строки |
copy |
копирует символы из строки в массив |
data |
возвращает указатель на первый символ строки |
empty |
возвращает true если в строке нет символов |
end |
возвращает итератор, установленный после последнего символа строки |
erase |
удаляет символы из строки |
find |
ищет символы в строке |
find_first_not_of |
находит первый символ, отличный от |
find_first_of |
находит первый символ схожий с |
find_last_not_of |
находит последний символ, отличный от |
find_last_of |
находит последний символ, схожий с |
getline |
читает из потока ввода в строку |
insert |
вставляет символы в строку |
length |
возвращает длину строки |
max_size |
возвращает максимальное количество символов, которые могут содержаться в строке |
npos |
специальное значение, означающее «не найдено» или «все оставшиеся символы» |
push_back |
добавляет символ в конец строки |
rbegin |
возвращает обратный итератор на конец строки |
rend |
возвращает обратный итератор на начало строки |
replace |
заменяет символы в строке |
reserve |
устанавливает минимальную вместимость строки |
resize |
меняет размер строки |
rfind |
находит последнее вхождение подстроки |
size |
возвращает количество символов в строке |
substr |
возвращает определённую подстроку |
swap |
меняет две строки содержимым |
Решите задачу:
Задача 3. Написать программу сравнения двух строк. Разбор задачи. Чтобы понять, что означает одна строка "больше" или "меньше", чем другая строка, рассмотрим процесс расстановки имен по алфавиту. Вы, без сомнения, поставили бы "Jones" перед "Smith", потому что в алфавите J раньше S. Но как компьютер узнает о порядке следования букв? Помните? - все символы представляются внутри компьютера как численные коды; когда компьютер сравнивает две строки, он на самом деле сравнивает численные коды символов в строке. (Замечание: коды символов упорядочены по алфавиту только для латинских букв, к кириллице это, к сожалению, не относится)
#include <string>
string st( "Цена бутылки воды\n" );
Длину строки возвращает функция size() (длина не включает завершающий нулевой символ).
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, как и встроенного типа, можно обращаться с помощью операции взятия индекса. Вот, например, фрагмент кода, заменяющего все точки символами подчеркивания:
string str( "fa.disney.com" );
int size = str.size();
for ( int ix = 0; ix < size; ++ix )
if ( str[ ix ] == '.' ) str[ ix ] = '_';
Вот и все, что мы хотели сказать о классе string прямо сейчас. На самом деле, этот класс обладает еще многими интересными свойствами и возможностями. Скажем, предыдущий пример реализуется также вызовом одной-единственной функции replace():
replace( str.begin(), str.end(), '.', '_' );
Эта функция пробегает диапазон от begin() до end(), которые возвращают указатели на начало и конец строки, и заменяет элементы, равные третьему своему параметру, на четвертый.