Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Apr 25th, 2012  |  syntax: None  |  size: 8.49 KB  |  hits: 18  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  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. }