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

1 ... 29 30 31 [ 32 ] 33 34 35 ... 196


#define ICHAR TRAITS H #include <cassert> linclude <cctype> linclude <cmath> linclude <cstddef> linclude <ostream> linclude <string>

using std::allocator; using std::basic string; using std::char traits; using std::ostream; using std::size t: using std::string: using std:;toupper: using std;:tolower;

struct ichar traits : char traits<char> { Изменяются только функции сравнения символов, static bool eqCchar cist, char c2nd) { return toupper(clst) == toupper(c2nd):

static bool neCchar cist, char c2nd) { return !eq(clst. c2nd):

static bool lt(char cist, char c2nd) { return toupper(clst) < toupper(c2nd);

static int

compareCconst char* stri. const char* str2. size t n) for(size t i = 0: i < n; i++) { ifCstrl == 0) return -1; else if(str2 == 0) return 1;

else if(tolower(*strl) < tolower(*str2)) return -1;

else if(tolower(*strl) > tolower(*str2)) return 1:

assert(tolower(*strl) == tolower(*str2)): strl++; str2++; Compare the other chars

return 0;

static const char*

findCconst char* si. size t n. char c) { whileCn-- > 0) if(toupper(*sl) == toupper(c))

return si: else ++sl: return 0;

typedef basic string<char. ichar traits> istring;

inline ostream& operator (ostream& os. const istring& s) { return OS string(s.c str(). s.lengthO);



#endif ICHAR TRAITS H /:-

Мы создали определение типа istring, чтобы наш класс был во всех отношениях аналогичен обычному классу string, кроме одного - все сравнения осуществляются без учета регистра символов. Для удобства также предоставлена перефужен-ная версия операторной функции operator () для вывода строк. Пример:

: СОЗ:ICompare.срр #include <cassert> #include <iostream> #1nclude ichar traits.h using namespace std:

int mainO {

Буквы совпадают, отличается только регистр:

istring first = tHis :

istring second = ThIS :

cout fi rst endl:

cout second endl:

assert(first.compare(second) == 0):

assert(first.find(h) == 1):

assertCfirst.findCI ) == 2):

assert(first.find(x) == string::npos): } III:-

Впрочем, это сильно упрощенный, ненастоящий пример. Чтобы класс istring стал полностью эквивалентным string, необходимо определить другие функции, обеспечивающие его работу.

В заголовочном файле <string> также определяется строковый класс с расширенной кодировкой символов:

typedef basic string<wchar t> wstring:

Поддержка расширенных кодировок проявляется в расширенных потоках ввода-вывода (класс wostream вместо ostream, также определяемый в <iostream>) и заголовочном файле <cwctype>, расширенной версии <cctype>. Наряду со специализацией шаблона char traits по типу wchar t в стандартной библиотеке это позволяет создать версию ichar traits для символов в расширенной кодировке:

: C03:iwchar traits.h {-g++}

Создание класса характеристик для расширенных символов

#ifndef IWCHAR TRAITS H

#define IWCHAR TRAITS H

#include <cassert>

#i nclude <cmath>

#include <cstddef>

#include <cwctype>

#include <ostream>

#include <string>

using std: :anocator: using std::basic string: using std::char traits: using std::towlower: using std::towupper: using std::wostream: using std::wstring:

struct iwchar traits : char traits<wchar t> {



Изменяются только функции сравнения символов, static bool eq(wchar t cist. wchar t c2nd) { return towupper(clst) == towupper(c2nd):

static bool ne(wchar t cist. wchar t c2nd) { return towupper(clst) != towupper(c2nd):

static bool lt(wchar t cist. wchar t c2nd) { return towupper(clst) < towupper(c2nd):

static int compare(const wchar t* stri. const wchar t* str2, size t n) { for(size t i = 0; i < n; i++) { if(strl == 0)

return -1: else if(str2 == 0) return 1:

else if(towlower(*strl) < towlower(*str2)) return -1:

else if(towlower(*strl) > towlower(*str2)) return 1:

assert(towlower(*strl) == towlower(*str2)): strl++; str2++; Сравнение следующих wchar t

return 0:

static const wchar t* find(const wchar t* si. size t n. wchar t c) { while(n-- > 0) if(towupper(*sl) == towupper(c))

return si: else ++sl: return 0:

typedef basic string<wchar t. iwchar traits> iwstring:

inline wostreamS. operator (wostream& os. const iwstringS s) {

return OS wstring(s.c str(), s.lengthO):

#endif IWCHAR TRAITS H 111

Как видите, задача в основном сводится к простой подстановке символа w

в некоторых местах исходной программы. Тестовая программа выглядит так:

: C03:IWCompare.cpp {-g++} #include <cassert> #include <iostream> linclude iwchar traits.h using namespace std:

int mainO {

Буквы совпадают, отличается только регистр: iwstring wfirst = L tHis : iwstring wsecond = L ThIS : wcout wfi rst endl: wcout wsecond endl:



1 ... 29 30 31 [ 32 ] 33 34 35 ... 196

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