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

解決


権六  2007-11-23 02:55:03  No: 66946

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-23 03:44:05  No: 66947

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

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

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


権六  2007-11-23 05:37:08  No: 66948

>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-23 07:43:49  No: 66949

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

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


επιστημη  2007-11-23 08:15:16  No: 66950

> 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 10:35:35  No: 66951

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加