首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(C++/WinAPI)反转LPSTR

(C++/WinAPI)反转LPSTR
EN

Stack Overflow用户
提问于 2012-10-14 22:15:19
回答 2查看 665关注 0票数 2

我在反转LPSTR时遇到了一些问题。下面是我的函数:

代码语言:javascript
复制
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:

代码语言:javascript
复制
*(lpReversed + i) = (CHAR) *(a_lpText + nTextLength - i - 1);

冻结整个程序。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-15 00:49:36

这看起来更像是C代码,而不是C++,所以我将坚持这种风格。我不明白你为什么要用GlobalAlloc。你只需要它用于DDE,我无法想象你会在这里使用它。如果这确实是C++,则使用mallocnew[]

如果您真的在使用需要GlobalAlloc的DDE,那么请将GlobalAlloc部分与字符串反转代码分开。将这两个关注点混合在一起会导致代码不可维护。

如果这真的是C++,那么您应该尽可能地使用std::string

我也认为所有的类型转换和所有非标准的Windows类型宏都有很大的混淆。这会使代码变得几乎不可读。

正如Maximus指出的那样,还有一个索引错误。不管怎么说,我会把函数写成这样:

代码语言:javascript
复制
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[],那么你甚至不需要这么做。在这种情况下,代码将如下所示:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2012-10-14 23:17:59

试试这个)

代码语言:javascript
复制
*(lpReversed + i) = (CHAR) *(a_lpText + nTextLength - i - 1);

检查a_lpText是否为空和长度为零是很好的!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12883035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档