メモリ領域をコピーする関数ってありますか?

解決


権六  2007-11-22 17:55:03  No: 66946  IP: 192.*.*.*

BYTE lpBuffer[256], lpTemp[16];

lpTempを繰り返し、複数回lpBufferに順にコピーしたいんですが、

for(i = 0; i < 10; i++)

    lstrcat(lpBuffer, lpTemp)
}

では、17文字ごとに(17バイトごとに)ゴミデータが入ってしまってうまくいきません。
どうしたらいいでしょうか・・

ANSIビルドですので、lstrcatはstrcatになっていると思います。

ちなみに
for(i = 0; i < 10, i++)
{
    for(j = 0; j < 16; j++)
        ipBuffer[i * 16 + j] = lpTemp[j];
}

とすると、lpTempのデータがそのまま繰り返し、lpBufferにコピーされています。

VC6.0  SDKです。

編集 削除
ゴン  2007-11-22 18:44:05  No: 66947  IP: 192.*.*.*

for (int i=0; i<sizeof(lpBuffer) / sizeof(lpTemp); i++)
    memcpy(lpBuffer + sizeof(lpTemp) * i, lpTemp, sizeof(lpTemp));

これでいけると思います。

文字列系の関数を使っているからNULL('\0')が最後に追加されているのでは?

編集 削除
権六  2007-11-22 20:37:08  No: 66948  IP: 192.*.*.*

>for (int i=0; i<sizeof(lpBuffer) / sizeof(lpTemp); i++)
>    memcpy(lpBuffer + sizeof(lpTemp) * i, lpTemp, sizeof(lpTemp));

>これでいけると思います。?

やはり地道にコピーするしかないですか・・
memcat みたいな関数ってなさそうですね。

>文字列系の関数を使っているからNULL('\0')が最後に追加されているので>は?

はい。多分そうだと思います。
ただlpBufferのほうは、はじめにゼロで初期化してるんです。
例えば

TCHAR lpStr[] = TEXT("hello"), lpText[] = TEXT("world");

ZeroMemory(lpBuffer, 256);

lstrcat((LPTSTR)lpBuffer, lpStr);
lstrcat((LPTSTR)lpBuffer, lpText);

MessageBox(NULL, (LPCTSTR)lpBuffer, NULL, 0);

で、結果は  helloworldになると思うんですけど、上の繰り返し付け足していくコードではそうならないんです。
なんでかなぁと。

編集 削除
みい  2007-11-22 22:43:49  No: 66949  IP: 192.*.*.*

16文字ずつコピーですよね。

strcatは文字列(最後NULL)の追加だから、
lpTemp[16]→lpTemp[17]
にして16バイト目にNULLいれとかないと駄目ですよ。
配列外のがくっついて入っていってるんですよ。

編集 削除
επιστημη  2007-11-22 23:15:16  No: 66950  IP: 192.*.*.*

> memcat みたいな関数ってなさそうですね。

C++ならstd::copyが。

#include <iostream>
#include <algorithm>

int main() {
  const char* src = "※この文字列は4バイトずつコピーされる。";
  char        dst[64] = {0};
  char* p = dst;
  for ( int i = 0; i < 10; ++i ) {
    p = std::copy(src, src+4, p);
    std::cout << '[' << dst << ']' << std::endl;
    src += 4;
  }
}

編集 削除
権六  2007-11-23 01:35:35  No: 66951  IP: 192.*.*.*

みいさんのおっしゃるとおりでした。
ほかのパラメーターを色々変えてみたりしても、うまくいかなくて正に目からウロコでした。
わたしがやりたかったのも、まさにみいさんの御推察のとおりでございます(笑
質問してよかったです。
みなさん、どうもありがとうございました。

編集 削除