Библиотека String  1.0
Own String library. Лабораторная работа ФБИТ ИТМО
identstr.cpp
См. документацию.
1 /*!
2 \file
3 \brief Реализация методов класса "Строка-идентификатор"
4 
5 Данный файл содержит в себе реализации методов производного
6 от "Строка" класса "Строка-идентификатор"
7 */
8 #include <iostream>
9 #include <cstring>
10 
11 #include "own/string.h"
12 #include "own/identstr.h"
13 
14 namespace own {
15 
16 IdentStr::IdentStr(int val) : String(val)
17 {
18  std::cout << "IdentStr::IdentStr(int val) : String(val), val = " << val << std::endl;
19 }
20 
21 IdentStr::IdentStr(const char* Str) : String(Str)
22 {
23  if (!((pCh[0] >= 'a' && pCh[0] <= 'z') || (pCh[0] >= 'A' && pCh[0] <= 'Z') || (pCh[0] == '_'))) {
24  std::cout << "Bad symbol, pCh[0] = " << pCh[0] << std::endl;
25  delete[] pCh;
26  len = 0;
27  pCh = new char[len + 1];
28  pCh[0] = '\0';
29  return;
30  }
31  for (int i = 1; i < len; i++) {
32  if (!((pCh[i] >= 'a' && pCh[i] <= 'z') || (pCh[i] >= 'A' && pCh[i] <= 'Z') || (pCh[i] >= '0' && pCh[i] <= '9') || (pCh[i] == '_'))) {
33  std::cout << "Bad String, pCh[" << i << "] = " << pCh[i] << std::endl;
34  delete[] pCh;
35  len = 0;
36  pCh = new char[len + 1];
37  pCh[0] = '\0';
38  return;
39  }
40  }
41  std::cout << "IdentStr::IdentStr(char* Str) : String(Str)" << std::endl;
42 }
43 
44 IdentStr::IdentStr(const IdentStr& from) : String(from)
45 {
46  std::cout << "IdentStr::IdentStr(const IdentStr& from) : String(from)" << std::endl;
47 }
48 
50 {
51  std::cout << "IdentStr::~IdentStr()" << std::endl;
52 }
53 
55 {
56  int digitsNum = 0;
57  for (int i = 1; i < len; i++) {
58  if (pCh[i] >= '0' && pCh[i] <= '9') {
59  digitsNum++;
60  }
61  }
62  return digitsNum;
63 }
64 
66 {
67  if (&S != this) {
68  delete[] pCh;
69  len = strlen(S.pCh);
70  pCh = new char[len + 1];
71  strcpy(pCh, S.pCh);
72  }
73  std::cout << "IdentStr& IdentStr::operator=(const IdentStr& S)" << std::endl;
74  return *this;
75 }
76 
77 IdentStr operator&(const IdentStr& pobj1, const IdentStr& pobj2)
78 {
79  bool check[256];
80  memset(check,0,256);
81  for (int i = 0; i < pobj1.len; i++) {
82  check[pobj1.pCh[i]] = true;
83  }
84  char* tmp2 = new char[pobj2.len];
85  int j = 0;
86  for (int i = 0; i < pobj2.len; i++) {
87  if (!check[pobj2.pCh[i]]) {
88  tmp2[j++] = pobj2.pCh[i];
89  }
90  }
91  IdentStr tmp(pobj1.len + j);
92  int i = 0;
93  j = 0;
94  while (i < pobj1.len)
95  tmp.pCh[i++] = pobj1.pCh[j++];
96  j = 0;
97  while (i < tmp.len)
98  tmp.pCh[i++] = tmp2[j++];
99  std::cout << "IdentStr operator&(const IdentStr& pobj1, const IdentStr& pobj2)" << std::endl;
100  delete[] tmp2;
101  return tmp;
102 }
103 
104 IdentStr operator&(const IdentStr& pobj1, const char* pobj2)
105 {
106  if (pobj1.len == 0) {
107  IdentStr tmp(pobj2);
108  return tmp;
109  }
110  int pobj2len = strlen(pobj2);
111 
112  bool check[256];
113  memset(check,0,256);
114  for (int i = 0; i < pobj1.len; i++) {
115  check[pobj1.pCh[i]] = true;
116  }
117  char* tmp2 = new char[pobj2len];
118  int j = 0;
119  for (int i = 0; i < pobj2len; i++) {
120  if (!((pobj2[i] >= 'a' && pobj2[i] <= 'z') || (pobj2[i] >= 'A' && pobj2[i] <= 'Z') ||
121  (pobj2[i] >= '0' && pobj2[i] <= '9') || (pobj2[i] == '_'))) {
122  std::cout << "Bad String, pobj2[" << i << "] = " << pobj2[i] << std::endl;
123  IdentStr tmp(0);
124  return tmp;
125  }
126 
127  if (!check[pobj2[i]]) {
128  tmp2[j++] = pobj2[i];
129  }
130  }
131  IdentStr tmp(pobj1.len + j);
132  int i = 0;
133  j = 0;
134  while (i < pobj1.len)
135  tmp.pCh[i++] = pobj1.pCh[j++];
136  j = 0;
137  while (i < tmp.len)
138  tmp.pCh[i++] = tmp2[j++];
139  std::cout << "IdentStr operator&(const IdentStr& pobj1, const char* pobj2)" << std::endl;
140  delete[] tmp2;
141  return tmp;
142 }
143 
144 IdentStr operator&(const char* pobj1, const IdentStr& pobj2)
145 {
146  IdentStr tmp1(pobj1);
147  if (tmp1.len == 0) {
148  return IdentStr(0);
149  }
150  return tmp1 & pobj2;
151 }
152 
153 }
own::IdentStr
Производный от "Строка" класс "Строка-идентификатор".
Definition: identstr.h:24
own::IdentStr::IdentStr
IdentStr(int=0)
Definition: identstr.cpp:16
own::String
Базовый класс "Строка".
Definition: string.h:17
string.h
Заголовочный файл с описанием класса "Строка".
own::IdentStr::getDigitsNum
int getDigitsNum()
Definition: identstr.cpp:54
own::String::pCh
char * pCh
Адрес динамически выделенной памяти для размещения символов строки
Definition: string.h:20
own::operator&
IdentStr operator&(const IdentStr &pobj1, const IdentStr &pobj2)
Definition: identstr.cpp:77
own::String::len
int len
Длина строки
Definition: string.h:19
own::IdentStr::operator=
IdentStr & operator=(const IdentStr &)
Definition: identstr.cpp:65
own::IdentStr::~IdentStr
~IdentStr()
Definition: identstr.cpp:49
identstr.h
Заголовочный файл с описанием класса "Строка-идентификатор".