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です。
for (int i=0; i<sizeof(lpBuffer) / sizeof(lpTemp); i++)
memcpy(lpBuffer + sizeof(lpTemp) * i, lpTemp, sizeof(lpTemp));
これでいけると思います。
文字列系の関数を使っているからNULL('\0')が最後に追加されているのでは?
>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になると思うんですけど、上の繰り返し付け足していくコードではそうならないんです。
なんでかなぁと。
16文字ずつコピーですよね。
strcatは文字列(最後NULL)の追加だから、
lpTemp[16]→lpTemp[17]
にして16バイト目にNULLいれとかないと駄目ですよ。
配列外のがくっついて入っていってるんですよ。
> 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;
}
}
みいさんのおっしゃるとおりでした。
ほかのパラメーターを色々変えてみたりしても、うまくいかなくて正に目からウロコでした。
わたしがやりたかったのも、まさにみいさんの御推察のとおりでございます(笑
質問してよかったです。
みなさん、どうもありがとうございました。
ツイート | ![]() |