C++. Сборник рецептов.

4.1. Дополнение строк.

Проблема.

Требуется «дополнить» — или заполнить - строку некоторым количеством символов до определенной длины. Например, может потребоваться дополнить строку "Chapter 1" точками до 20 символов в длину так, чтобы она выглядела как "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> ( string — это typedef для basic_string<char>, a wstring — это typedef для basic_string<wchar_t>), так что они работают как для строк из узких, так и широких символов. Их использование по мере необходимости, как в предыдущем примере, прекрасно работает, но при использовании методов basic_string в собственных вспомогательных функциях общего назначения эти функции следует создавать, используя общий существующий дизайн стандартной библиотеки и шаблоны функций. Рассмотрим код примера 4.1, который определяет общий шаблон функции pad, который работает для строк типа basic_string.

Пример 4.1. Общий шаблон функции pad.

#include <string>

#include <iostream>

Using namespace std;

// Общий подход.

Template<typename >

Void pad(basic_string<T>& s,

 typename basic_string<T>::size_type n, T c) {

 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 в примере 4.1 дополняет данную строку s до длины n, используя символ c. Так как шаблон функции использует параметризованный тип элементов строки ( T), он будет работать для basic_string из любых символов: char, wchar_t или любых других, определенных пользователем.