Требуется «дополнить» — или заполнить - строку некоторым количеством символов до определенной длины. Например, может потребоваться дополнить строку "Chapter 1"
"Chapter 1..........."
.Для дополнения строк начальными или концевыми символами используйте функции-члены (методы) insert
append
класса string
. Например, чтобы дополнить конец строки 20 символами X
:std::string s = "foo";
s.append(20 - s.length(), 'X');
Чтобы дополнить начало строки:
s.insert(s.begin(), 20 - s.length(), 'X');
Разница в использовании двух функций заключается в первом параметре insert
begin
возвращает итератор, указывающий на первый элемент строки, так что в этом примере последовательность символов добавляется слева от него. Параметры, общие для всех функций, — это количество раз, которое требуется повторить символ, и сам символ.insert
append
— это методы шаблона класса basic_string
, описанного в заголовочном файле
(string
— это typedef
для basic_string
, a wstring
— это typedef
для basic_string
), так что они работают как для строк из узких, так и широких символов. Их использование по мере необходимости, как в предыдущем примере, прекрасно работает, но при использовании методов basic_string
в собственных вспомогательных функциях общего назначения эти функции следует создавать, используя общий существующий дизайн стандартной библиотеки и шаблоны функций. Рассмотрим код примера 4.1, который определяет общий шаблон функции pad, который работает для строк типа basic_string.#include
#include
using namespace std;
// Общий подход
template
void pad(basic_string
typename basic_string
if (n > s.length())
s.append(n - s.length(), c);
}
int main() {
string s = "Appendix A";
wstring ws = L"Acknowledgments"; // "L" указывает, что
// этот литерал состоит из
pad(s, 20. "*"); // широких символов
pad(ws, 20, L'*');
// cout << s << std::endl; // He следует пытаться выполнить это
wcout << ws << std::endl; // одновременно
}
pad
s
до длины n, используя символ c
. Так как шаблон функции использует параметризованный тип элементов строки (T
), он будет работать для basic_string
из любых символов: char
, wchar_t
или любых других, определенных пользователем.4.2. Обрезка строк
Требуется обрезать несколько символов в конце или начале строки, обычно пробелов.
Для определения позиции строки, которую требуется удалить, используйте итераторы, а для ее удаления — метод erase
rtrim
, которая удаляет символ в конце строки.#include
#include
// Подход для строк из узких символов
void rtrim(std::string& s, char с) {
if (s.empty()) return;
std::string::iterator p;
for (p = s.end(); p != s.begin() && *--p == c;);
if (*p != c) p++;
s.erase(p, s.end());
}
int main() {
std::string s = "zoo";
rtrim(s, 'o');
std::cout << s << '\n';
}
Пример 4.2 выполняет все необходимое для строк длины char
basic_string
и шаблон функции. Пример 4.3 использует для удаления символов в конце строки любого типа шаблон функции.#include
#include
using namespace std;
// Общий подход к обрезке отдельных
// символов строки
template
void rtrim(basic_string
if (s.empty()) return;
typename basic_string
for (p = s.end(); p != s.begin() && *--p == c;);