Назад | Начало урока | Вперед
Содержание

Глава 3

Поиск первого/последнего символа из заданного подмножества
Функции find_first_not_of() и find_last_not_of() удобно использовать для создания небольшой утилиты, удаляющей пропуски с обеих концов строки. (АВ: в java есть готовая функция для этого). Обратите внимание функция не изменяет оригинал, а возвращает новую строку.

Вверх


//: C03:Trim.h
// Утилита для удаления пропусков с концов строки.
#ifndef TRIM_H
#define TRIM_H
#include <string>
#include <cstddef>

inline std::string trim(const std::string& s) {

if(s.length() == 0)
return s;
int beg = s.find_first_not_of(" \a\b\f\n\r\t\v");
int end = s.find_last_not_of(" \a\b\f\n\r\t\v");
if(beg == std::string::npos) // Строка содержит только пропуски
return "";
return std::string(s, beg, end - beg + 1);
}
#endif // TRIM_H ///:~


Анализ:

Первый тест выясняет, не является ли строка пустой; в этом случае проверка не выполняется, и функция возвращает копию строки. Обратите внимание, после нахождения конечных точек конструктор string строит новую строку на основе старой по заданной начальной позиции и длине.

Такие общецелевые утилиты нуждаются в тщательном тестировании:

Вверх


//: C03:TrimTest.h
#ifndef TRIMTEST_H
#define TRIMTEST_H
#include "Trim.h"
#include "../TestSuite/Test.h"

class TrimTest : public TestSuite::Test {

enum {NTESTS = 11};
static std::string s[NTESTS];
public:
void testTrim() {
test_(trim(s[0]) == "abcdefghijklmnop");
test_(trim(s[1]) == "abcdefghijklmnop");
test_(trim(s[2]) == "abcdefghijklmnop");
test_(trim(s[3]) == "a");
test_(trim(s[4]) == "ab");
test_(trim(s[5]) == "abc");
test_(trim(s[6]) == "a b c");
test_(trim(s[7]) == "a b c");
test_(trim(s[8]) == "a \t b \t c");
test_(trim(s[9]) == "");
test_(trim(s[10]) == "");
}
void run() {
testTrim();
}
};
#endif // TRIMTEST_H ///:~


Анализ:

Вверх


//: C03:TrimTest.cpp {0}
#include "TrimTest.h"

// Инициализация статических данных
std::string TrimTest::s[TrimTest::NTESTS] = {

" \t abcdefghijklmnop \t ",
"abcdefghijklmnop \t ",
" \t abcdefghijklmnop",
"a", "ab", "abc", "a b c",
" \t a b c \t ", " \t a \t b \t c \t ",
"\t \n \r \v \f",
"" // Также необходимо провести проверку пустой строки
}; ///:~


Анализ:

Вверх


//: C03:TrimTestMain.cpp
//{L} ../TestSuite/Test TrimTest
#include "TrimTest.h"

int main() {

TrimTest t;
t.run();
return t.report();
} ///:~


Результат:

Анализ:

На примере массива string видно, как символьные массивы автоматически преобразовываются в объекты string. В массив включены примеры для проверки факта удаления пробелов и символов табуляции с обоих концов строки, а так же примеры, показывающий, что пробелы и табуляции в середине строки остаются на своих местах.


Назад | Начало урока | Вверх | Вперед
Содержание

Hosted by uCoz