(C ++ / WinAPI)反转LPSTR

时间:2012-10-14 14:15:19

标签: c++ winapi chars reversing 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()不起作用。我只想要char的复制字符。

编辑2:

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

冻结整个计划。

2 个答案:

答案 0 :(得分:3)

试试这个)

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

最好将a_lpText检查为NULL和零长度!

答案 1 :(得分:2)

这看起来更像C代码而不是C ++,所以我会坚持这种风格。我无法理解您使用GlobalAlloc的原因。您只需要DDE,我无法想象您在这里使用它。如果这确实是C ++,请使用mallocnew[]

如果您确实使用的是需要GlobalAlloc的DDE API,请将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;
}

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

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