Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/**
*
* \file string5_kesz.cpp
*
* Itt kell megvalĂłsĂtania a hiĂĄnyzĂł tagfĂźggvĂŠnyeket.
* SegĂtsĂŠgĂźl megadtuk a C-ben megĂrt vĂĄltozatban (string1.c) hasznĂĄlt fĂźggvĂŠnyneveket.
*
* Ha valamit INLINE-kĂŠnt valĂłsĂt meg, akkor annak a .h-ba kell kerĂźlnie,
* akĂĄr kĂvĂźl akĂĄr osztĂĄlyon belĂźl definiĂĄlja. (Az inline fĂźggvĂŠnyeknek minden
* fordĂtĂĄsi egysĂŠgben elĂŠrhetĹknek kell lenniĂźk)
* *
* A tesztelĂŠskor ne felejtse el beĂĄllĂtani a header ĂĄllomĂĄnyban az ELKESZULT makrĂłt.
* A VC sajĂĄt memĂłriafogyĂĄs ellenĹrzĹje csak debug mĂłdban (Debug->Start) mĹąkĂśdik!
*
*/
#ifdef _MSC_VER
// MSC ne adjon figyelmeztetĹ Ăźzenetet a stringkezelĹ fĂźggvĂŠnyekre.
#define _CRT_SECURE_NO_WARNINGS
#endif
#include <iostream> // KiĂratĂĄshoz
#include <cstring> // StringmĹąveletekhez
// a standard headerek utĂĄn kell lennie
#ifndef MEMTRACE
#include "memtrace.h"
#endif
#include "string5.h"
using std::cin;
using std::ios_base;
/// Konstruktor: egy char karakterbĹl (createStrFromChar)
String::String(char ch) {
// MeghatĂĄrozzuk a hosszĂĄt
len = 1;
// Lefoglalunk a helyet a hossznak + a lezarĂł nullĂĄnak
pData = new char[len+1];
// BetesszĂźk a karaktert
pData[0] = ch;
pData[1] = '\0';
}
// Konstruktor: egy nullĂĄval lezĂĄrt char sorozatbĂłl (createStringFromCharStr)
String::String(const char *p) {
// MeghatĂĄrozzuk a hosszĂĄt
len = strlen(p);
// Helyet foglalunk
pData = new char[len+1];
// BemĂĄsoljuk a stringet, ami le van zĂĄrva 0-val Ăgy hasznĂĄlhatĂł az strcpy is
strcpy(pData, p);
}
// MĂĄsolĂł konstruktor
String::String(const String& s1) {
// MeghatĂĄrozzuk a hosszĂĄt
len = s1.len;
// Helyet foglalunk
pData = new char[len+1];
// BemĂĄsoljuk a stringet, ami le van zĂĄrva 0-val Ăgy hasznĂĄlhatĂł az strcpy is
strcpy(pData, s1.pData);
}
//Ha nem egyezik meg a stringek hossza hamissal tér vissza
//Egyébként pedig végigmegy a karaktereken,
//és igazzal tér vissz ha egyeznek, amúgy pedig hamissal
else {
for (size_t i = 0; i < len; i++){
if (this[i] == tbc[i]){
}
else{
return false;
}
}
return true;
}
}
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
bool String::operator!=(const String& tbc){
if (len == tbc.len){
return false;
}
else{
for (size_t i = 0; i < len; i++){
if (this[i] != tbc[i]){
return true;
}
}
return false;
}
return true;
}
// operator=
String& String::operator=(const String& rhs_s) {
if (this != &rhs_s) {
delete[] pData;
len = rhs_s.len;
// Helyet foglalunk
pData = new char[len+1];
// BemĂĄsoljuk a stringet, ami le van zĂĄrva 0-val Ăgy hasznĂĄlhatĂł az strcpy is
strcpy(pData, rhs_s.pData);
}
return *this;
}
// [] operĂĄtorok: egy megadott indexĹą elem REFERENCIĂJĂVAL tĂŠrnek vissza.
// indexhiba esetĂŠn dobjon egy const char * tĂpusĂş hibĂĄt!
char& String::operator[](unsigned int idx) {
if (idx >= len) throw "String: indexelesi hiba";
return pData[idx];
}
const char& String::operator[](unsigned int idx) const {
if (idx >= len) throw "String: indexelesi hiba";
return pData[idx];
}
// + operĂĄtor, ami kĂŠt stringet ad Ăśssze (concatString)
String String::operator+(const String& rhs_s) const {
String temp; // ide kerĂźl az eredmĂŠny
// MeghatĂĄrozza az Ăşj string hosszĂĄt
temp.len = len + rhs_s.len;
// FelszabadĂtja a temp adattaerĂźletĂŠt
delete []temp.pData;
// lefoglalja a memĂłriĂĄt az Ăşj stringnek.
temp.pData = new char[temp.len+1];
// Az elejĂŠre bemĂĄsolja az elsĹ stringet
strcpy(temp.pData, pData);
// BemĂĄsolja a mĂĄsodik stringet.
strcat(temp.pData, rhs_s.pData);
return temp; // visszatĂŠr az eredmĂŠnnyel
}
String& String::operator+=(char c){
char temp[] = {c, '\0'};
return (*this = *this + String(temp));
}
// << operator, ami kiĂr az ostream-re
std::ostream& operator<<(std::ostream& os, const String& s0) {
os << s0.c_str();
return os;
}
// << operĂĄtor, ami beolvas az istreamrĹl egy szĂłt
std::istream& operator>>(std::istream& is, String& s0) {
unsigned char ch;
s0 = String(""); // Ăźres string, ehhez fĹązĂźnk hozzĂĄ
std::ios_base::fmtflags fl = is.flags(); // eltesszĂźk a rĂŠgi flag-eket
is.setf(ios_base::skipws); // az elejĂŠn eldobjuk a ws-t
while (is >> ch) {
is.unsetf(ios_base::skipws); // utĂĄna pedig mĂĄr nem
if (isspace(ch)) {
is.putback(ch); // na ezt nem kĂŠrjĂźk
break;
} else {
s0 = s0 + ch; // vĂŠgĂŠre fĹązzĂźk a karaktert
}
}
is.setf(fl); // visszaĂĄllĂtjuk a flag-eket
return is;
}