|
Программирование >> Разработка устойчивых систем
Начало текущего слова: s1ze t current = s.rfindC :): Перебор строки в обратном направлении: wh1le(current != string::npos){ Занесение слов в вектор. Переменная current инкрементируется перед копированием, чтобы предотвратить копирование ограничителя: ++current: strings.push back( s.substr(current, last - current)); Пропустить найденный ограничитель и установить last в конец следующего слова: current -= 2; last = current + 1: Поиск следующего ограничителя current = S.rfindC:. current): Получение первого слова, не имеющего префикса-ограничителя. strings.push back(s.substr(0. last)): void testDataO { Тестирование в новом порядке: test (strings[0] == This ): test (strings[l] == is ); test (strings[2] == going ); test (strings[3] == to ); test (strings[4] == make ); test (strings[5] == sense ); test (strings[6] == now. ): string sentence: for(int i = 0; i < strings.sizeO - 1; i++) sentence += strings[i3 += ; Вручную занести последнее слово, чтобы избежать сохранения лишнего пробела, sentence += strings[strings.size() - 1]; test (sentence == This is going to make sense now. ); void runO { parseForOataO; testOataO; #endif RPARSE H /:- : C03:Rparse.cpp {L} ../TestSuite/Test #include Rparse.h int mainO { RparseTest t; t.runO: return t.reportO: } III:- Строковая функция rfind() перебирает строку в обратном направлении, ищет заданные лексемы и возвращает массив индексов совпадающих символов (или string::npos в случае неудачи). Поиск первого/последнего символа из заданного подмножества Функции find first of() и find last of() удобно использовать для создания небольшой утилиты, удаляющей пропуски с обоих концов строки. Обратите внимание: функция не изменяет оригинал, а возвращает новую строку: : C03:Trim.h Утилита для удаления пропусков с концов строки, lifndef TRIM H #def1ne TRIM H linclude <string> linclude <cstddef> inline std::string trimCconst std::string& s) { if(s.lengthO = 0) return s: int beg - s.find first not of( \a\b\f\n\r\t\v ): int end = s.findJast not of( \a\b\f\n\r\t\v ): ifCbeg -= std::string::npos) Строка содержит только пропуски return ; return std::string(s. beg, end - beg + 1): #endif TRIM H III:- Первый тест выясняет, не является ли строка пустой; в этом случае проверка не выполняется, и функция возвращает копию строки. Обратите внимание: после нахождения конечных точек конструктор string строит новую строку на основе старой по заданной начальной позиции и длине. Такие общецелевые утилиты нуждаются в тщательном тестировании: : C03:TrimTest.h lifndef TRIMTEST H Idefine TRIMTESTJ linclude Trim.h linclude ../TestSuite/Test.h class TrimTest : public TestSuite::Test { enum {NTESTS - 11}: Static std::string s[NTESTS]: public: void testTrimO { test (trim(s[0]) == abcdefghijklmnop ) test (trim(s[l]) == 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 be ): test (trim(sC7]) =- a b c ): test (trim(s[8]) =- a \t b \t c ): test (trim(s[9]) =- ): test (trim(s[10]) -= ): void runO { testTrimO: #endif TRIMTEST H /:- : СОЗ:TrimTest.срр {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 с \t . \t a \t b \t с \t . \t \n \r \v \f . Также необходимо провести проверку пустой строки }: III:- II: C03:TrimTestMain.cpp {L} ../TestSuite/Test TrimTest #include TrimTest.h int mainO { TrimTest t: t.runO: return t.reportO: } III:- Ha примере массива strings видно, как символьные массивы автоматически преобразовываются в объекты string. В массив включены примеры для проверки факта удаления пробелов и символов табуляции с обоих концов строки, а также примеры, показывающие, что пробелы и табуляции в середине строки остаются на своих местах. Удаление символов из строк Функция erase() класса string легко и эффективно удаляет символы из строк. Функция получает два аргумента: начальную позицию удаления (по умолчанию 0) и количество удаляемых символов (по умолчанию string::npos). Если заданное количество символов больще количества оставшихся символов в строке, стираются все символы до конца (таким образом, вызов erase() без аргументов удаляет из строки все символы). Допустим, вы хотите удалить из файла HTML все теги со специальными символами; предполагается, что после удаления останется примерно тот же текст, который отображался в браузере, но только в виде простого текстового файла. В следующем примере для решения этой задачи используется функция erase(): : C03:HTMLStripper.cpp {RunByHand} {L} ReplaceAll Фильтр для удаления тегов и маркеров HTML #include <cassert> #i nclude <cmath> #i nclude <cstddef> #i nclude <fstream> #i nclude <iostream> linclude <string> #include ReplaceAll.h linclude ../require.h using namespace std;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |