У меня есть некоторые проблемы, чтобы отменить 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);
Заморозить всю программу
Это больше похоже на код на 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;
}
Нужно всегда стремиться писать код без приведения.
Не делайте арифметику указателей самостоятельно, когда оператор индекса []
может быть использован. Так гораздо проще читать.
Попробуй это )
*(lpReversed + i) = (CHAR) *(a_lpText + nTextLength - i - 1);
И будет хорошо проверить a_lpText на NULL и нулевую длину!