Select Git revision
UserContext.tsx
string5.cpp 5.28 KiB
/**
*
* \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);
}
//Egyenlőséget vizsgáló operátor
bool String::operator==(const String& tbc){
//Ha nem egyezik meg a stringek hossza hamissal tér vissza
if (len != tbc.len){
return false;
}
//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;
}
}
//Nem egyenlőséget vizsgáló operátor
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;
}