Программирование >>  Разработка устойчивых систем 

1 ... 26 27 28 [ 29 ] 30 31 32 ... 196


Начало текущего слова: 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;



1 ... 26 27 28 [ 29 ] 30 31 32 ... 196

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика