2012-10-14 67 views
2

我有一些問題可以反轉LPSTR。 這裏是我的功能:(C++/WinAPI)反轉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

您需要添加空終止符。 –

+1

@MikeKwan GPTR必須返回零初始化的內存。 – Maximus

+0

你爲什麼使用GlobalAlloc?你爲什麼要把'LPSTR'轉換成'char *'? 「CHAR」到哪裏去了,爲什麼又投了?你只需要在這裏投一個。 –

回答

2

這看起來更像是C++而不是C++,所以我會堅持這種風格。我不明白你爲什麼會使用GlobalAlloc。你只需要DDE,我不可能想象你在這裏使用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; 
} 

一個人應該總是努力寫代碼沒有強制轉換。

當可以使用索引運算符[]時,不要自己進行指針運算。這樣閱讀就容易多了。

3

試試這個)

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

這將是很好的檢查a_lpText爲NULL和零長度!