Advertisement
Guest User

Untitled

a guest
May 6th, 2010
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.32 KB | None | 0 0
  1. // ================= File MyStr.h
  2. #ifndef _MyStr_H
  3. #define _MyStr_H
  4.  
  5. class MyStr
  6. {
  7.     char* p;
  8.  
  9.     MyStr (int len);
  10. public:
  11.     MyStr (const char* s = "");
  12.     MyStr (const MyStr &b);
  13.     ~MyStr ();
  14.  
  15.     void xuat () const;
  16.     void nhap ();
  17.  
  18.     MyStr& NoiVaoCuoiChuoi (const char* s);
  19.     MyStr& NoiVaoCuoiChuoi (const MyStr& b);
  20.     MyStr& operator+= (const char* s);
  21.     MyStr& operator+= (const MyStr& b);
  22.  
  23.     MyStr& operator= (const char* s);
  24.     MyStr& operator= (const MyStr& b);
  25.  
  26.     MyStr Noi2Chuoi (const char* s) const;
  27.     MyStr Noi2Chuoi (const MyStr& b) const;
  28. friend MyStr Noi2Chuoi (const char* t, const char* s);
  29. friend MyStr Noi2Chuoi (const char* s, const MyStr& b);
  30.     MyStr operator+ (const char* s) const;
  31.     MyStr operator+ (const MyStr& b) const;
  32. /*friend    MyStr operator + (const char* t, const char* s);
  33. friend  MyStr operator + (const char* s, const MyStr& b);*/
  34.  
  35. friend ostream& operator<< (ostream& os, const MyStr& b);
  36. friend istream& operator>> (istream& is, MyStr& b);
  37.  
  38.     MyStr SubMyStr (int begin, int end) const;
  39.     MyStr Left (int len = -1) const;
  40.     MyStr Mid (int begin, int len = -1) const;
  41.  
  42.     int TimViTri (const char* s, int start = 0) const;
  43.     int TimViTri (const MyStr& s, int start = 0) const;
  44. };
  45.  
  46. #endif // _MyStr_H
  47.  
  48. // ================= File MyStr.cpp
  49. #include <iostream>
  50. using namespace std;
  51. #include <cstring>
  52. #include "MyStr.h"
  53.  
  54. MyStr::MyStr (int len)
  55. {
  56.     p = new char[len + 1];
  57. }
  58.  
  59. MyStr::MyStr (const char* s)
  60. {
  61.     p = strdup(s);
  62. }
  63.  
  64. MyStr::MyStr (const MyStr &b)
  65. {
  66.     p = strdup(b.p);
  67. }
  68.  
  69. MyStr::~MyStr ()
  70. {
  71.     delete[] p;
  72. }
  73.  
  74. //---------------------- Xuat - Nhap ------------------------
  75. void MyStr::xuat () const
  76. {
  77.     cout << p << '|' << endl;
  78. }
  79.  
  80. void MyStr::nhap ()
  81. {
  82.     const int MAX = 100;
  83.     char buf[MAX];
  84.     cin.getline (buf, sizeof(buf));
  85.  
  86.     if (strlen (p) <= strlen (buf))
  87.     {
  88.         delete[] p;
  89.         p = strdup (buf);
  90.     }
  91.     else
  92.         strcpy (p, buf);
  93. }
  94.  
  95.  
  96. //---------------------- Noi vao cuoi chuoi ------------------------
  97. MyStr& MyStr::NoiVaoCuoiChuoi (const char* s)
  98. {
  99.     MyStr res (strlen(p) + strlen(s));
  100.     strcpy (res.p, p);  // 2: MyStrCopy p -> pNew
  101.     strcat (res.p, s);  // 3: MyStrCat s -> pNew
  102.     //delete[] p;       // 4: delete p
  103.     p = strdup(res.p);  // 5: pNew -> p
  104.  
  105. /*  char* pNew;
  106.     pNew = new char[strlen(p) + strlen(s) + 1]; // 1: new pNew
  107.     strcpy (pNew, p);   // 2: MyStrCopy p -> pNew
  108.     strcat (pNew, s);   // 3: MyStrCat s -> pNew
  109.     //delete[] p;       // 4: delete p
  110.     //p = pNew; // 5: pNew -> p
  111.     p = strdup (pNew);
  112.     delete[] pNew;*/
  113.  
  114.     return *this;
  115. }
  116.  
  117. MyStr& MyStr::NoiVaoCuoiChuoi (const MyStr& b)
  118. {
  119.     this->NoiVaoCuoiChuoi(b.p);
  120.  
  121.     return *this;
  122. }
  123.  
  124. MyStr& MyStr::operator+= (const char* s)
  125. {
  126.     this->NoiVaoCuoiChuoi(s);
  127.  
  128.     return *this;
  129. }
  130.  
  131. MyStr& MyStr::operator+= (const MyStr& b)
  132. {
  133.     return *this += b.p;
  134. }
  135.  
  136.  
  137. //---------------------- Noi 2 chuoi ------------------------
  138. MyStr& MyStr::operator= (const char* s)
  139. {
  140.     if (strlen (p) <= strlen (s))
  141.     {
  142.         delete[] p;
  143.         p = strdup(s);
  144.     }
  145.     else
  146.         strcpy (p, s);
  147.  
  148.     return *this;
  149. }
  150.  
  151. MyStr& MyStr::operator= (const MyStr& b)
  152. {
  153.     return *this = b.p;
  154. }
  155.  
  156. MyStr MyStr::Noi2Chuoi (const char* s) const
  157. {
  158.     MyStr res (strlen(p) + strlen(s)); // 1: new MyStr
  159.     strcpy (res.p, p);  // 2: MyStrCopy p -> pNew
  160.     strcat (res.p, s);  // 3: MyStrCat s -> pNew
  161.  
  162.     return res;
  163. }
  164.  
  165. MyStr MyStr::Noi2Chuoi (const MyStr& b) const
  166. {
  167.     return this->Noi2Chuoi(b.p);
  168. }
  169.  
  170. MyStr MyStr::operator+ (const char* s) const
  171. {
  172.     return this->Noi2Chuoi(s);
  173. }
  174.  
  175. MyStr MyStr::operator+ (const MyStr& b) const
  176. {
  177.     return *this + b.p;
  178. }
  179.  
  180. MyStr Noi2Chuoi (const char* t, const char* s)
  181. {
  182.     MyStr res (strlen(t) + strlen(s)); // 1: new MyStr
  183.     strcpy (res.p, t);  // 2: MyStrCopy p -> pNew
  184.     strcat (res.p, s);  // 3: MyStrCat s -> pNew
  185.  
  186.     return res;
  187. }
  188.  
  189. MyStr Noi2Chuoi (const char* s, const MyStr& b)
  190. {
  191.     return Noi2Chuoi(s, b.p);
  192. }
  193.  
  194. /*MyStr operator + (const char* t, const char* s)
  195. {
  196.     MyStr res (strlen(t) + strlen(s)); // 1: new MyStr
  197.     strcpy (res.p, t);  // 2: MyStrCopy p -> pNew
  198.     strcat (res.p, s);  // 3: MyStrCat s -> pNew
  199.  
  200.     return res;
  201. }
  202.  
  203. MyStr operator + (const char* s, const MyStr& b)
  204. {
  205.     MyStr res (strlen(s) + strlen(b.p)); // 1: new MyStr
  206.     strcpy (res.p, s);  // 2: MyStrCopy p -> pNew
  207.     strcat (res.p, b.p);    // 3: MyStrCat s -> pNew
  208.  
  209.     return res;
  210. }*/
  211.  
  212.  
  213. //---------------------- Xuat Nhap ------------------------
  214. ostream& operator<< (ostream& os, const MyStr& b)
  215. {
  216.     return os << b.p << '|';
  217. }
  218.  
  219. istream& operator>> (istream& is, MyStr& b)
  220. {
  221.     const int MAX = 256;
  222.     char buf[MAX];
  223.     is.getline (buf, sizeof (buf));
  224.  
  225.     b = buf;
  226.  
  227.     return is;
  228. }
  229.  
  230.  
  231. //---------------------- Lay chuoi ------------------------
  232. MyStr MyStr::SubMyStr (int begin, int end = -1) const
  233. {
  234. /*  !!!! Goi y:
  235.     1. Chinh ly so lieu :   if: begin < 0   ----> begin = 0;
  236.                             if: end > len (chieu dai cua chuoi)
  237.                               or            ----> end = len
  238.                                 end < 0
  239.  
  240.     2. Tao chuoi con :  if: begin < end     ----> len = end - begin
  241.                         else:               ----> chuoi rong
  242.           1/    delete
  243.           2/    new
  244.           3/    strncpy // len = end - begin + 1
  245. */
  246.     MyStr res (end - begin + 1);    // bien trung gian, chuoi rong
  247.     int len = strlen (p) + 1;
  248.  
  249.     // 1. Chinh ly so lieu:
  250.     if (begin < 0)
  251.         begin = 0;
  252.     if (end > len || end < 0)
  253.         end = len;
  254.  
  255.     // 2. Tao chuoi con:
  256.     if (begin < end)
  257.     {
  258.         len = end - begin + 1;
  259.         strncpy (res.p, p + begin, len);
  260.         res.p[len] = '\0'; // vi tri chuoi la ki tu NULL de cho thoat
  261.     }
  262.  
  263.     return res;
  264. }
  265.  
  266. MyStr MyStr::Left (int inLen) const
  267. {
  268.     MyStr res (inLen + 1);
  269.     int len = strlen (p) + 1;
  270.  
  271.     // 1. Chinh ly so lieu:
  272.     if (inLen < 0 || inLen > len)
  273.         inLen = len;
  274.  
  275.     // 2. Tao chuoi con:
  276.     len = inLen + 1;
  277.     strncpy (res.p, p, len);
  278.     res.p[len] = '\0';
  279.  
  280.     return res;
  281. }
  282.  
  283. MyStr MyStr::Mid (int begin, int len) const // kho hiu
  284. {
  285.     // 1. Chinh ly so lieu
  286.     MyStr res (len - begin + 1);
  287.     if (begin < 0)
  288.         begin = 0;
  289.     if (len < begin)
  290.         len = strlen (p) + 1;
  291.  
  292.     // 2. Tao chuoi con:
  293.     strncpy (res.p, p + begin, len + 1);
  294.     res.p[len + 1] = '\0';
  295.  
  296.     return res;
  297. }
  298.  
  299. // ================= File Main.cpp
  300. #include <iostream>
  301. using namespace std;
  302. #include <cstring>
  303. #include "MyStr.h"
  304.  
  305. int main ()
  306. {
  307.     cout << "------ BAI TAP LOP MyStr ------\n"
  308.         << "    (Ki tu | la ki tu NULL)\n\n";
  309.  
  310. /*  MyStr a, b;
  311.     cout << "Nhap vao chuoi A: ";
  312.     cin >> a;
  313.     cout << " - Chuoi A: " << a << endl;
  314.     cout << "Nhap vao chuoi B: ";
  315.     cin >> b;
  316.     cout << " - Chuoi B: " << b << endl;*/
  317.  
  318.     MyStr a("chao ban");
  319.     MyStr b("bun wa");
  320.     cout << " - Chuoi A: " << a << endl;
  321.     cout << " - Chuoi B: " << b << endl;
  322.  
  323.     cout << "\n------------------------------------------------";
  324.     cout << "\n --- (A + B) Noi chuoi A voi chuoi B ---\n";
  325.     cout << "Chuoi dc noi: " << a + b << endl;
  326.     cout << " - Chuoi A: " << a << endl;
  327.     cout << " - Chuoi B: " << b << endl;
  328.  
  329.     cout << "\n------------------------------------------------";
  330.     MyStr c = a;
  331.     cout << "\n  -- (C = A) Tao chuoi C la chuoi A -- \n";
  332.     cout << " - Chuoi C: " << c << endl;
  333.     cout << " --- (c += B) Noi chuoi B vao chuoi C ---\n";
  334.     cout << " - Chuoi A: " << a << endl;
  335.     cout << " - Chuoi B: " << b << endl;
  336.     cout << " - Chuoi C: " << (c += b) << endl;
  337.  
  338.     MyStr d = Noi2Chuoi("chan ge", b);
  339.     cout << "\n --- (D = 'chan ge' + B) Tao chuoi D la chuoi A cong chuoi B --- \n";
  340.     cout << " - Chuoi D: " << d << endl << endl;
  341.  
  342.     cout << " --- Lay chuoi ---\n";
  343.     cout << "Lay trong chuoi D tu ky tu 1 -> 5: "
  344.          << d.SubMyStr (1, 5) << endl;
  345.  
  346.     return 0;
  347. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement