fork download
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <cstdio>
  4.  
  5. class MyString
  6. {
  7. public:
  8. MyString(const char* str)
  9. {
  10. int length = Length(str);
  11. char* s1 = new char[length+1];
  12. for (int i = 0; i < length; i++)
  13. {
  14. s1[i] = str[i];
  15. }
  16. s1[length] = '\0';
  17. MyString::str = s1;
  18. }
  19. ~MyString()
  20. {
  21. std::cout << "deleting at: "<< ((void*)str) << std::endl;
  22. delete[] str; //очищуємо місце, котре виділялось під оті ваші стрічки
  23. }
  24.  
  25. friend std::ostream& operator<<(std::ostream& os, const MyString& ms);
  26.  
  27. void operator+=(char* str)
  28. {
  29. int length = Length() + Length(str); // отримуємо довжину нової строки
  30. char *s = new char[length+1]; // для термінатора
  31. for (int i = 0; i < Length(); i++)// записуємо в нову строку те, що вже було
  32. {
  33. s[i] = MyString::str[i];
  34. }
  35. for (int i = 0; i < Length(str); i++)// дописуємо те, що треба додати
  36. {
  37. s[i + Length()] = str[i];
  38. }
  39. delete[] MyString::str;
  40. MyString::str = s;// присвоюємо старому вказівнику на стару
  41. MyString::str[length] = '\0'; //- це термінатор
  42. }
  43.  
  44. void Remove(char* charsToRemove)
  45. {
  46. int index = 0;
  47. std::cout << "Remove's entry..." << std::endl;
  48. int lengthToRemove = Length(charsToRemove); // дізнаємось про довжину строки, котру треба видалити
  49. std::cout << "Length to remove: " << lengthToRemove << std::endl;
  50. for (int i = 0; i < Length(); i++) //починається цикл пошуку потрібної підстроки в нашій головній стрічці
  51. {
  52. for (int j = 0; j < lengthToRemove; j++) //перевірка, чи співпадає поточний знак головної строки - першому знаку строки для видалення
  53. {
  54. if (str[i] != charsToRemove[j])// якщо не співпадає, то прериваємо цей підцикл, та йдемо далі по головній стрічці
  55. {
  56. std::cout << "Wrong character comparsion:" << str[i] << " and " << charsToRemove[j] << std::endl;
  57. break;
  58. }
  59. else // якщо співпадає, то йдемо далі
  60. {
  61. if (j == 0) // якщо поточний знак головної строки співпадає саме з першим знаком підстроки для видалення
  62. {
  63. index = i; // запам'ятовуємо індекс цього знаку (можливо, цей індекс вказує на початок підстроки)
  64. }
  65. std::cout << "Something found... " << j+1 << " need all "<<lengthToRemove << std::endl;
  66.  
  67.  
  68. if (i < Length()) //якщо ми не в кінці головної строки
  69. {
  70.  
  71. i++; //то збільшуємо індекс головного циклу, таким чином ми йдемо до перевірки наступного знаку головної строки
  72. }
  73. else
  74. {
  75. break; // якщо ж ми не знайшли цілу підстроку, то капець, прериваємо цикл
  76. }
  77.  
  78. if (j == lengthToRemove - 1) //якщо ми знайшли цілу підстроку в нашій головній стрічці
  79. {
  80. std::cout << "I have got it!" << std::endl;
  81. int newStrLength = Length() - lengthToRemove; // рахуємо довжину нової строки (якою вона буде після операції видалення)
  82. std::cout <<"New string will have length: "<< newStrLength << std::endl;
  83.  
  84. char* newStr = new char[newStrLength+1]; // виділяємо пам'ять під цю строку, +1 для ТЕРМІНАТОРА!
  85.  
  86. std::cout << "First cycle has going on" << std::endl;
  87.  
  88. if (index > 0){ // якщо індекс початку підстроки більше нуля
  89. for (int k = 0; k < index; k++) //цей цикл буде заповнювати нову підстроку тими знаками, котрі йдуть перед нею в головній стрічці
  90. {
  91. std::cout << "k is: " << k << " index is: " << index << std::endl;
  92.  
  93. std::cout << "At " << k << " index we have: " << str[k] << std::endl;
  94.  
  95. newStr[k] = str[k];
  96. }
  97.  
  98. std::cout << "Second cycle has going on" << std::endl;
  99.  
  100. for (int l = index; l < Length()-((lengthToRemove-2)+index); l++) // а цей цикл заповнює нову підстроку знаками, що йдуть після підстроки в головній стрічці
  101. {
  102. std::cout << "At " << l << " index we have: " << str[l+index+(lengthToRemove-2)] << std::endl;//я не знаю, як воно працює, просто натикав щось навмання =(
  103. newStr[l] = str[l + index + (lengthToRemove - 2)];
  104. }
  105. }
  106. else //якщо ж підстрока починається з 0 індексу в головній стрічці
  107. {
  108. for (int h = 0; h < newStrLength; h++)//цей цикл просто заповнює нову строку тим, що йде після підстроки в головній стрічці
  109. {
  110. std::cout << "At " << h << " index we have: " << str[h+lengthToRemove] << std::endl;
  111. newStr[h] = str[h + lengthToRemove];
  112. }
  113. }
  114. newStr[newStrLength] = '\0'; // ставимо ТЕРМІНАТОРА!
  115. delete[] str; //звільнюємо місце старої стрічки
  116. str = newStr; //запам'ятовуємо посилання на нову
  117. std::cout << "Done!" << std::endl;
  118.  
  119. }
  120. }
  121. }
  122. }
  123. }
  124.  
  125. int Length()
  126. {
  127. int i = 0;
  128. while (str[i]!='\0')
  129. {
  130. i++;
  131. }
  132. return i;
  133. }
  134. private:
  135. char *str;
  136. int Length(const char* str)
  137. {
  138. int i = 0;
  139. while (str[i] != '\0')
  140. {
  141. i++;
  142. }
  143. return i;
  144. }
  145. };
  146.  
  147. std::ostream& operator<<(std::ostream& os, const MyString& ms)
  148. {
  149. os << ms.str;
  150. return os;
  151. }
  152.  
  153. int main()
  154. {
  155. MyString mys = "abcde", mys1 = mys;
  156. return 0;
  157. }
Runtime error #stdin #stdout #stderr 0s 3432KB
stdin
Standard input is empty
stdout
deleting at: 0x9623008
deleting at: 0x9623008
stderr
*** Error in `./prog': double free or corruption (fasttop): 0x09623008 ***
======= Backtrace: =========
/lib/i386-linux-gnu/i686/cmov/libc.so.6(+0x75e72)[0xb7591e72]
/lib/i386-linux-gnu/i686/cmov/libc.so.6(+0x76bb0)[0xb7592bb0]
/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZdlPv+0x1f)[0xb777482f]
/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZdaPv+0x1b)[0xb777487b]
./prog[0x80488b5]
/lib/i386-linux-gnu/i686/cmov/libc.so.6(__libc_start_main+0xf5)[0xb75358f5]
./prog[0x8048931]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:03 1295711    /home/mUO0v2/prog
08049000-0804a000 rw-p 00000000 08:03 1295711    /home/mUO0v2/prog
09623000-09644000 rw-p 00000000 00:00 0          [heap]
b751a000-b751c000 rw-p 00000000 00:00 0 
b751c000-b76c5000 r-xp 00000000 08:03 1303839    /lib/i386-linux-gnu/i686/cmov/libc-2.17.so
b76c5000-b76c6000 ---p 001a9000 08:03 1303839    /lib/i386-linux-gnu/i686/cmov/libc-2.17.so
b76c6000-b76c8000 r--p 001a9000 08:03 1303839    /lib/i386-linux-gnu/i686/cmov/libc-2.17.so
b76c8000-b76c9000 rw-p 001ab000 08:03 1303839    /lib/i386-linux-gnu/i686/cmov/libc-2.17.so
b76c9000-b76cc000 rw-p 00000000 00:00 0 
b76cc000-b76e7000 r-xp 00000000 08:03 1303883    /lib/i386-linux-gnu/libgcc_s.so.1
b76e7000-b76e8000 rw-p 0001a000 08:03 1303883    /lib/i386-linux-gnu/libgcc_s.so.1
b76e8000-b76e9000 rw-p 00000000 00:00 0 
b76e9000-b772a000 r-xp 00000000 08:03 1303836    /lib/i386-linux-gnu/i686/cmov/libm-2.17.so
b772a000-b772b000 r--p 00040000 08:03 1303836    /lib/i386-linux-gnu/i686/cmov/libm-2.17.so
b772b000-b772c000 rw-p 00041000 08:03 1303836    /lib/i386-linux-gnu/i686/cmov/libm-2.17.so
b772c000-b7808000 r-xp 00000000 08:03 1345926    /usr/lib/i386-linux-gnu/libstdc++.so.6.0.18
b7808000-b7809000 ---p 000dc000 08:03 1345926    /usr/lib/i386-linux-gnu/libstdc++.so.6.0.18
b7809000-b780d000 r--p 000dc000 08:03 1345926    /usr/lib/i386-linux-gnu/libstdc++.so.6.0.18
b780d000-b780e000 rw-p 000e0000 08:03 1345926    /usr/lib/i386-linux-gnu/libstdc++.so.6.0.18
b780e000-b7815000 rw-p 00000000 00:00 0 
b7817000-b781b000 rw-p 00000000 00:00 0 
b781b000-b781c000 r-xp 00000000 00:00 0          [vdso]
b781c000-b783b000 r-xp 00000000 08:03 1303796    /lib/i386-linux-gnu/ld-2.17.so
b783b000-b783c000 r--p 0001f000 08:03 1303796    /lib/i386-linux-gnu/ld-2.17.so
b783c000-b783d000 rw-p 00020000 08:03 1303796    /lib/i386-linux-gnu/ld-2.17.so
bfeeb000-bff00000 rw-p 00000000 00:00 0          [stack]