wsprintfの公然の秘密

win32apiにあるwsprintfという関数がある。
C標準のsprintfと同じような使い方なのだが次の点に注意する必要がある
(1)1024byteを超えるとワトソン吐いて死ぬ。

//"aaa  aaa  aaa  aaa  aaa"という連続する文字列を出そうとする
char szbuf[1500];
memset(&szbuf, 0, sizeof(szbuf));
for(int i=0; i<300; i++){
  wsprintf(szbuf, "%s%-05s", szbuf, "aaa");
}

とか、やると確実に落ちる。
なので、バッファを1000byteぐらいに区切って、そのたびに、strcatで繋いだりする。
Cのsprintfはそんなことはなく、手元のcygwingccで試した結果、1500byte程度なら問題なくバッファが作成される。


(2)フォーマット文字列より長くなる可能性がある

char szBuf[100];
memset(&szBuf, 0, sizeof(szBuf));
wsprintf(szBuf, "%10s", "0123456789abcde"); // 明らかに10byteより長い文字列を入れる
int len = strlen(szBuf); // 長さは15byte

代入する側の文字列のサイズがフォーマット記述子よりも長い場合は「代入する文字列のサイズになる」
これって、Cのsprintfでも同じなのかな?
。。。。あ。今手元のcygwinで試すと、やっぱり長くなる。。
なんだ。元々、そういうものなんだ。