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にのみ必要です。これが本当に C++ の場合はmallocorを使用します。new[]

を必要とする DDE API を実際に使用している場合は、その部分を文字列反転コードから分離してGlobalAllocおいてください。GlobalAlloc2 つの懸念事項を混在させると、コードが保守不能になります。

これが本当に 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 に答える