Змінив char str[], на вказівник char* str, хотів запропонувати, але подумав що ти сам до цього дійдеш. Взагалі молодець.
Тепер зауваження.
1. Про ініціалізацію об’єктів. Запам’яти просто, якщо ти ініціюєш змінну без new, то вона живе до виходу за межі її видимості.
{
{
int aaa;
...
}
// тут змінної вже aaa і не видно і її немає, вона знищена
}
Але якщо ти використовуєш операцію new, то змінна розташовується в "кучі" (це така область пам’яті) і тобі повертається вказівник на цю змінню в кучі.
{
{
int* bbb = new (int);
...
// тут ти может дістатися створеного об’єкта в кучі через вказівник bbb
}
// тут вже bbb не видно, але об’єкт в кучі залишився, бо ти його не видалив
}
якщо тобі вже не потрібен об’єкт, створенний оператором new, його потрібно видалити оператором delete, інакше пам’ять в кучі так і залишиться занятою.
Правило просте - new і delete завжди ходять в парі. Якщо об’єкт створюється за допомогою оператора new то він повинен знищуватись за допомогою оператора delete. Для знащиення масива, створеного за допомогою new, використовуються оператор delete[], не плутати!
{
{
int* bbb = new (int);
...
// тут ти может дістатися створеного об’єкта в кучі через вказівник bbb
delete bbb; // вказівник ще є, але об’єкт на який він вказує вже знищено
}
// тут вже bbb не видно, але об’єкт в кучі залишився, бо ти його не видалив
}
2. Стрічки C-типу (що являють собою массив char) по-хорошому повинні закінчуватися на символ "термінальний нуль" - '\0', бо саме цей символ вважається кінцем стрічки в багатьох операціях і в << в тому числі. Тому, коли ти з’єднуєш дві свої стрічки то розмір роби на одиницю більшим і в кінець став термінальний нуль. В тебе такий розмір дивний і виходить бо strlen шукає термінальний нуль в массиві і їй байдуже що він закнічився.
Це основні зауваження.
На бутер вже є. Навіть з ікрою. З кількома ікринками