Несколько вещей:
result = new char[strlen(str)];
Должно быть
result = new char[len + 1];
len
, потому что вы уже рассчитали длину str
и + 1
, чтобы освободить местодля NUL-терминатора.
Во-вторых, вам нужно скопировать строку в result
, прежде чем работать с ней, потому что в противном случае ваш массив полон мусора, иначе:
strcpy(result, str);
В-третьих,
std::reverse(str, &str[strlen(str)]);
Неправильно по двум причинам: во-первых, потому что вы не можете изменить строковые литералы, и во-вторых, потому что вы должны использовать result
:
std::reverse(result, result + len);
Но если вы делаетедля этого вам также необходимо сначала скопировать str
в result
.
И, наконец, установка указателя на NULL
не освобождает память, на которую он указывает.Вы должны
delete[] result; // delete[] because new[]
Обратите внимание, что для того, чтобы это работало, даже если взято else
(и поэтому result
не указывает на выделенную память), вам нужно сделать
char* result = NULL; // delete[] is defined as a nop on NULL pointers
Все вышесказанное применимо, если вы уверены, что хотите использовать Си-струны.Как только вы освоитесь с указателями, вы можете перейти к std::string
:
std::string str("testing");
std::reverse(std::begin(str), std::end(str)); // or if you don't want to do it in-place,
// std::string result(str.rbegin(), str.rend());