(C ++ / WinAPI) Реверсивный LPSTR

У меня есть некоторые проблемы, чтобы отменить LPSTR.
Вот моя функция:

LPSTR Reverse(LPSTR a_lpText)
{
int nTextLength = strlen((char*)a_lpText);
LPSTR lpReversed = (LPSTR) GlobalAlloc(GPTR, nTextLength + 1);
for (int i = 0; i < nTextLength; ++i)
*(lpReversed + i) = (CHAR) *(a_lpText + nTextLength - i);
return lpReversed;
}

Функция, возвращающая не инициализированный LPSTR или некоторые странные символы.
Проблема, вероятно, в преобразовании? Спасибо за ответы!

Редактировать 1: strcat () не работает. Я просто хочу скопировать символ за символом.

Изменить 2:

*(lpReversed + i) = (CHAR) *(a_lpText + nTextLength - i - 1);

Заморозить всю программу

2

Решение

Это больше похоже на код на C, чем на C ++, поэтому я буду придерживаться этого стиля. Я не могу понять, почему вы будете использовать GlobalAlloc, Вам нужно только это для DDE, который я не могу себе представить, что вы используете здесь. использование malloc или же new[] если это действительно C ++.

Если вы действительно используете DDE API, который требует GlobalAllocзатем сохраните GlobalAlloc часть, отдельная от строки, обращающей код. Смешивание этих двух проблем приводит к не поддерживаемому коду.

Если это действительно C ++, то std::string это то, что вы должны использовать везде, где это возможно.

Я также думаю, что есть большая путаница со всеми типами кастинга и нестандартными макросами типа Windows. Это делает код практически нечитаемым.

Существует также ошибка индексации, указанная Maximus. Для чего бы это ни стоило, я написал бы функцию примерно так:

char* Reversed(const char* str)
{
int len = strlen(str);
char* reversed = (char*) malloc(len+1);
reversed[len] = 0;//ensure return string has null-terminator
for (int i = 0; i < len; ++i)
reversed[len-1-i] = str[i];
return reversed;
}

Единственное, что вам нужно, это возвращаемое значение malloc, Если бы вы были использовать new[] тогда вам даже не нужно будет этого делать. В этом случае код будет выглядеть так:

char* Reversed(const char* str)
{
int len = strlen(str);
char* reversed = new char[len+1];
reversed[len] = 0;//ensure return string has null-terminator
for (int i = 0; i < len; ++i)
reversed[len-1-i] = str[i];
return reversed;
}

Нужно всегда стремиться писать код без приведения.

Не делайте арифметику указателей самостоятельно, когда оператор индекса [] может быть использован. Так гораздо проще читать.

2

Другие решения

Попробуй это )

*(lpReversed + i) = (CHAR) *(a_lpText + nTextLength - i - 1);

И будет хорошо проверить a_lpText на NULL и нулевую длину!

3