私TCHAR
が取り組んでいる Visual C++ プロジェクトで使用しています。その定義を以下に示します。
#ifdef _UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
いくつかのデータを buffer に入れる必要がありますbuff
:
char buff[size] = {0}; // how to declare the buffer size - what should be its value ?
sprintf(buff, "%s (ID: %i)", res->name(), res->id());
どこ:
name()
戻り値TCHAR*
id()
戻り値int
の値を計算する方法size
- 実際のニーズに対する正確なバッファ容量 (Unicode が定義されていない場合は小さく、Unicode が定義されている場合は大きい) ? さらに、バッファ オーバーフローの可能性から身を守りたいのですが、どのような保護を使用すればよいですか?
さらに、ここではバッファを として宣言しましたchar
。バッファを として宣言した場合int
、サイズ値に違いはありますか (つまり、char として宣言された場合と比べて 4 倍小さくなります) ?
アップデート
Mats Peterssonの回答に部分的に基づいて私が思いついたのは次のとおりです。
size_t len;
const char *FORMAT;
#ifndef _UNICODE
len = strlen((char*)res->name());
FORMAT = "%s (ID: %i)";
#else
len = wcslen(res->name());
FORMAT = "%S (ID: %i)";
#endif
int size = 7 * sizeof(TCHAR) + /* place for characters inside format string */
len * sizeof(TCHAR) + /* place for "name" characters */
strlen(_itoa(id, ioatmp, 10)) * sizeof(TCHAR) + /* place for "id" digits */
1 * sizeof(TCHAR); /* zero byte(s) string terminator */
char *buff = new char[size]; /* buffer has to be declared dynamically on the heap,
* because its exact size is not known at compilation time */
sprintf(buff, FORMAT, name, id);
delete[] buff;
それは正しい考えですか、それとも私は何かを見逃しましたか?