我有一些问题要逆转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);
冻结整个计划。
答案 0 :(得分:3)
试试这个)
*(lpReversed + i) = (CHAR) *(a_lpText + nTextLength - i - 1);
最好将a_lpText检查为NULL和零长度!
答案 1 :(得分:2)
这看起来更像C代码而不是C ++,所以我会坚持这种风格。我无法理解您使用GlobalAlloc
的原因。您只需要DDE,我无法想象您在这里使用它。如果这确实是C ++,请使用malloc
或new[]
。
如果您确实使用的是需要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;
}
应该始终努力编写没有强制转换的代码。
当可以使用索引运算符[]
时,不要自己进行指针运算。用这种方式阅读会容易得多。