Лишние символы в c++, откуда?
Во-первых, new char выделит память только для одного символа, а у вас их много. То есть уже в следующей строке (cin >> array) проезд по памяти. Если пишете в целях обучения и нельзя брать std::string, то выделяйте с запасом, например new char[256]; Освобождать при этом память надо будет при помощи delete[] array;
Во-вторых, конец строки определяется по нулевому символу на конце. cin >> array делает это сам (пишет в конец array нулевой символ), а вы в своей функции нулевой символ не выставляете. Сделать это можно так:str[length_str] = '\0';
Но надо иметь в виду, что памяти надо выделить [хотя бы] на 1 больше, чем length_str.
Итого:
1. Вам надо в обоих случаях память выделять под массив. В первом случае можно под 256 элементов. В идеале при этом читать не при помощи cin, а другими функциями, дабы избежать переполнения на случай, если введут строку более длинную.
2. В reverse надо выставлять терминирующий нуль и исправить длину массива. Возможно вообще разворачивать строку по месту, т.е. менять местами буквы, а не создавать новую строку (в этом случае не надо ни память выделять, ни трогать терминирующий нуль, он останется на месте).
3. Вам надо удалять выделенную память по окончании использования при помощи delete []
Строкой (помимо класса std::string) в C/C++ называется массив char, оканчивающийся нулевым символом. (0x00 или '\0'). Все стандартные средства для работы со строками считают такой символ концом строки. А вы его перенесли вообще в начало.