Guest User

Untitled

a guest
Apr 25th, 2012
33
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.49 KB | None | 0 0
  1. #include <iostream>
  2. #include "String.h"
  3. using namespace std;
  4.  
  5. namespace HomeMadeString {
  6.  
  7. String::String() {pData=NULL; elementsNum=0;}
  8.  
  9. String::String (const String & string) {pData=NULL; strcpy(*this, string);}
  10.  
  11. String::String (const char* str)
  12. {
  13. elementsNum=strlen(str);
  14. if (elementsNum==0) {pData=NULL; return;}
  15. pData= new char [elementsNum];
  16. for (int i=0; i<elementsNum; i++) pData[i]=str[i];
  17. }
  18.  
  19. String::String (const char c, unsigned int times)
  20. {
  21. elementsNum=times;
  22. if (!elementsNum) {pData=NULL; return;}
  23. pData= new char [elementsNum];
  24. for (int i=0; i<elementsNum; i++) pData[i]=c;
  25. }
  26.  
  27. String::~String (void)
  28. {
  29. if (pData)
  30. {
  31. delete [] pData;
  32. }
  33. }
  34.  
  35. void String::getStr(char *pBuff)
  36. {
  37. int i;
  38. for (i=0; i<elementsNum; i++) pBuff[i]=pData[i];
  39. pBuff[i]='\0';
  40. }
  41.  
  42. void String::print(ostream &os)
  43. {
  44. for (int i=0; i<elementsNum; i++) os << pData[i];
  45. }
  46.  
  47. char String::getChar(unsigned int pos)
  48. {
  49. if ((pos<0) || (pos>elementsNum)) return 0;
  50. return pData[pos];
  51. }
  52.  
  53. //6 db függvény az oldalról:
  54.  
  55. String String::strcat(const String& string1, const String& string2)
  56. {
  57. String s;
  58. s.elementsNum=string1.elementsNum+string2.elementsNum;
  59. if (s.elementsNum==0) {s.pData=NULL; return s;}
  60. s.pData=new char [s.elementsNum];
  61. for (int i=0; i<string1.elementsNum; i++) s.pData[i]=string1.pData[i];
  62. for (int i=string1.elementsNum; i<string1.elementsNum+string2.elementsNum; i++)
  63. s.pData[i]=string2.pData[i-string1.elementsNum];
  64. return s;
  65. }
  66.  
  67. /* OPERÁTORRAL ÍGY LENNE AZ STRCAT
  68. String String::operator+(const String& string){
  69. String s;
  70. s.elementsNum=(elementsNum+string.elementsNum);
  71. if(s.elementsNum==0){pData=NULL; return s;}
  72. s.pData= new char [s.elementsNum];
  73. for(int i=0; i<elementsNum; i++) {s.pData[i]=pData[i];}
  74. for(int i=elementsNum; i<(string.elementsNum+elementsNum); i++){s.pData[i]=string.pData[i-elementsNum];}
  75. return s;
  76. }*/
  77.  
  78.  
  79. String String::strncat(const String& string1, const String& string2, int hatar)
  80. {
  81. String s;
  82. s.elementsNum=string1.elementsNum+hatar;
  83. if (s.elementsNum==0) {s.pData=NULL; return s;}
  84. s.pData=new char [s.elementsNum];
  85. for (int i=0; i<string1.elementsNum; i++) s.pData[i]=string1.pData[i];
  86. for (int i=string1.elementsNum; i<string1.elementsNum+hatar; i++)
  87. s.pData[i]=string2.pData[i-string1.elementsNum];
  88. return s;
  89. }
  90.  
  91. bool String::strcmp(const String& string1, const String& string2)
  92. {
  93. if (string1.elementsNum!=string2.elementsNum) return false;
  94. for (int i=0; i<string1.elementsNum; i++)
  95. if (string1.pData[i]!=string2.pData[i])
  96. return false;
  97. return true;
  98. }
  99.  
  100. /*OPERÁTORRAL ÍGY LENNE AZ STRCMP
  101. bool String::operator==(const String & string)
  102. {
  103. if(string.elementsNum!=elementsNum)return false;
  104. for(int i=0; i<elementsNum; i++){
  105. if(string.pData[i]!=pData[i]) return false;}
  106. return true;
  107. }*/
  108.  
  109. bool String::strncmp(const String& string1, const String& string2, int hatar)
  110. {
  111. if (string1.elementsNum!=string2.elementsNum) return false;
  112. for (int i=0; i<hatar; i++)
  113. if (string1.pData[i]!=string2.pData[i])
  114. return false;
  115. return true;
  116. }
  117. void String::strcpy(String &string1, const String &string2)
  118. {
  119. delete [] string1.pData;
  120. string1.elementsNum=string2.elementsNum;
  121. if (string1.elementsNum==0)
  122. {
  123. string1.pData=NULL;
  124. return;
  125. }
  126. string1.pData= new char [string1.elementsNum];
  127. for (int i=0; i<string1.elementsNum; i++)
  128. string1.pData[i]=string2.pData[i];
  129. }
  130.  
  131. /*OPERÁTORRAL ÍGY LENNE AZ STRCPY
  132. String & String::operator=(const String &string)
  133. {
  134.  
  135. delete[] pData;
  136. this->elementsNum=string.elementsNum;
  137. if(elementsNum==0){
  138. pData=NULL;
  139. return *this;}
  140. pData=new char [string.elementsNum];
  141. for(int i=0; i<string.elementsNum; ++i)
  142. pData[i]=string.pData[i];
  143. return *this;
  144. }*/
  145.  
  146. void String::strncpy(String &string1, const String &string2, int hatar)
  147. {
  148. delete [] string1.pData;
  149. string1.elementsNum=hatar;
  150. if (string1.elementsNum==0)
  151. {
  152. string1.pData=NULL;
  153. return;
  154. }
  155. string1.pData= new char [string1.elementsNum];
  156. for (int i=0; i<hatar; i++)
  157. string1.pData[i]=string2.pData[i];
  158. }
  159.  
  160. }
  161.  
  162.  
  163.  
  164.  
  165.  
  166. #ifndef STRING_H
  167. #define STRING_H
  168. #include <iostream> // Für cout, <iosfwd> waere übrigens genug hier
  169.  
  170. namespace HomeMadeString // unser Namensbereich; alles liegt auf diesem Namensbereich
  171. {
  172. class String
  173. {
  174. // Die aktuelle Anzahl von Zeichen
  175. unsigned int elementsNum;
  176.  
  177. // Der Pointer auf dem dynamischen Speicherbereich wo die Zeichen sind
  178. char *pData;
  179. public:
  180. // Parameterloser Konstruktor
  181. String();
  182.  
  183. // Kopierkonstruktor
  184. String (const String & string);
  185.  
  186. // Konstruktor mit nullterminierten C-Zeichenkette
  187. String (const char* str);
  188.  
  189. // Konstruktor mit einem Zeichen und mit einem unsigned int (times)
  190. // unser String wird mit "times" Stück von dem Zeichen "c" initialisiert
  191. String(char c, unsigned int times);
  192.  
  193. // Destruktor:
  194. ~String (void);
  195.  
  196. // Inhalt des String-Objektes in den Puffer pBuff kopieren und mit Nullzeichen terminieren
  197. // (Sie sollen annehmen, daß der Puffer wird von dem Anwender allokiert und freigegeben)
  198. void getStr(char * pBuff);
  199.  
  200. // Länge des Strings ermitteln
  201. unsigned int getLength() { return elementsNum; }
  202.  
  203. // String in einem Ausgabestrom schreiben ('cout' ist vom Typ ostream.)
  204. // Wir werden nie "using namespace" in einer Header-Datei schreiben, sondern wir geben
  205. // explizit std::ostream an. In der .cpp-Datei aber dürfen wir schon, wenn wir wollen.
  206. void print(std::ostream& os);
  207.  
  208. // Gibt das Zeichen in der Position pos zurück, oder 0 wenn die Position ungültig istsonst
  209. char getChar(unsigned int pos);
  210.  
  211. // --- Statische Funktionen. Sie werden zwei String-Variablen verarbeiten. ---
  212.  
  213. // Zwei Strings zusammenfügen und zurückgeben
  214. static String strcat(const String& string1, const String& string2);
  215.  
  216. static String strncat(const String& string1, const String& string2, int hatar);
  217.  
  218. // Zwei Strings vergleichen
  219. static bool strcmp(const String& string1, const String& string2);
  220.  
  221. static bool strncmp(const String& string1, const String& string2, int hatar);
  222.  
  223. // Das zweite String in die erste kopieren:
  224. static void strcpy(String& string1, const String& string2);
  225. static void strncpy(String& string1, const String& string2, int hatar);
  226. };
  227. }
  228. #endif /* STRING_H */
  229.  
  230.  
  231.  
  232.  
  233. #include <iostream>
  234. #include "String.h"
  235.  
  236. using namespace std;
  237. using namespace HomeMadeString;
  238.  
  239.  
  240.  
  241. int main()
  242. {
  243. // Den parameterlosen Konstruktor testen
  244. String s1;
  245. // Wir testen den Konstruktor, der eine C-String erwartet
  246. String s2 = "Hello, hello!"; // bedeutet eigentlich String s2 = String("Hello, hello!")
  247.  
  248. // Ergebnisse ausgeben
  249. s1.print(cout);
  250. cout << endl;
  251. s2.print(cout);
  252. cout << endl << endl;
  253.  
  254. // Die Kopierfunktion (statische Funktion) testen, Ergebnis ausgeben
  255. String::strcpy(s1,s2);
  256. s1.print(cout);
  257. cout << endl;
  258. s2.print(cout);
  259. cout << endl;
  260.  
  261. if(String::strcmp(s1,s2)) //strcmp
  262. cout << "s1 and s2 are the same!!!" << endl;
  263.  
  264.  
  265. String s7;
  266. String s8= "Helka";
  267. s7.print(cout);
  268. cout << endl;
  269. s8.print(cout);
  270. cout << endl;
  271. String::strncpy(s7,s8,3);
  272. s7.print(cout);
  273. cout << endl;
  274. s8.print(cout);
  275. cout << endl;
  276.  
  277. cout<<endl;
  278.  
  279. String s5= "Hello";
  280. String s6= "Helka";
  281. s5.print(cout); //strncmp itt csak az első három elem hasonlóságát vizsgálja
  282. cout << endl;
  283. s5.print(cout);
  284. cout << endl;
  285. String::strncmp(s5, s6,3);
  286. cout << "Helka and hello are the same, if you observe only 3 charakters of the string"<<endl;
  287. cout <<endl;
  288. s5.print(cout);
  289. cout << endl;
  290. s5.print(cout);
  291. cout << endl;
  292.  
  293.  
  294.  
  295.  
  296. // Den "Muster"-Konstruktor testen: String aus 15 Stück '-'
  297. String s3('-', 15);
  298. s3.print(cout);
  299. cout << endl;
  300.  
  301. // Die concatenate Funktion und den Kopierkonstruktor testen
  302. String s4 = String::strcat(s2,s3); //sima strcat, összefűz 2 sztringet
  303. s4.print(cout);
  304. cout << endl;
  305.  
  306.  
  307. String s9= String::strncat(s2, s3, 3); //csak az első három elemét fűzi hozzá a második sztringnek
  308. s9.print(cout);
  309. cout<<endl;
  310. cout <<endl;
  311.  
  312. // Die getChar Funktion (Indexierung) testen
  313. for(unsigned int i = 0; i < s4.getLength(); ++i)
  314. {
  315. cout << s4.getChar(i);
  316. }
  317. cout << endl;
  318.  
  319. // getStr testen
  320. char *pStr = new char[s4.getLength()+1]; // Platz für das Ergebnis und Nullterminator
  321. s4.getStr(pStr);
  322. cout << pStr << endl; // cout kennt auch C-Stringe!
  323. delete [] pStr; // Buffer freigeben
  324.  
  325. return 0;
  326. }
Advertisement
Add Comment
Please, Sign In to add comment