2

我有一些问题要反转 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);

冻结整个程序。

4

2 回答 2

3

试试这个)

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

最好检查 a_lpText 的 NULL 和零长度!

于 2012-10-14T15:17:58.713 回答
2

这看起来更像 C 代码而不是 C++,所以我会坚持这种风格。我不明白你为什么要使用GlobalAlloc. 你只需要 DDE,我无法想象你在这里使用它。使用mallocornew[]如果这真的是 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;
}

人们应该始终努力编写没有强制转换的代码。

[]当可以使用索引运算符时,不要自己进行指针运算。以这种方式阅读要容易得多。

于 2012-10-14T16:49:35.883 回答