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

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

#include

#include

using namespace std;

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

template

void pad(basic_string& s,

 typename basic_string::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 или любых других, определенных пользователем.

<p>4.2. Обрезка строк</p>Проблема

Требуется обрезать несколько символов в конце или начале строки, обычно пробелов.

Решение

Для определения позиции строки, которую требуется удалить, используйте итераторы, а для ее удаления — метод erase. Пример 4.2 показывает функцию rtrim, которая удаляет символ в конце строки.

Пример 4.2. Обрезка символов строки

#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, но работает только для них. Аналогично тому, что показано в примере 4.1, можно использовать общий дизайн basic_string и шаблон функции. Пример 4.3 использует для удаления символов в конце строки любого типа шаблон функции.

Пример 4.3. Обобщенная версия rtrim

#include

#include

using namespace std;

// Общий подход к обрезке отдельных

// символов строки

template

void rtrim(basic_string& s, T с) {

 if (s.empty()) return;

 typename basic_string::iterator p;

 for (p = s.end(); p != s.begin() && *--p == c;);

Перейти на страницу:

Похожие книги