Проблема в том, что std::string::length()
не включает терминатор NUL строки. Таким образом, s.copy(t, s.length());
копирует 'H', 'e', 'l', 'l', 'o'
в t
, но не '\0'
, который следует. Следующие элементы этого массива не обнуляются (они могут содержать некоторые нули случайно).
Но std::cout
при передаче char*
ожидает строку с нулевым символом в конце. Он будет продолжать печатать до тех пор, пока не найдет 0 байт или что-то еще не произойдет (переполнение t
- неопределенное поведение).
Вы можете «исправить» его, завершив нулем t
:
t[s.length()] = '\0';