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はそんなことはなく、手元のcygwinのgccで試した結果、1500byte程度なら問題なくバッファが作成される。
(2)フォーマット文字列より長くなる可能性がある
代入する側の文字列のサイズがフォーマット記述子よりも長い場合は「代入する文字列のサイズになる」char szBuf[100]; memset(&szBuf, 0, sizeof(szBuf)); wsprintf(szBuf, "%10s", "0123456789abcde"); // 明らかに10byteより長い文字列を入れる int len = strlen(szBuf); // 長さは15byte
これって、Cのsprintfでも同じなのかな?
。。。。あ。今手元のcygwinで試すと、やっぱり長くなる。。
なんだ。元々、そういうものなんだ。