Я использую TCHAR
в Visual C++ ПРОЕКТА я работаю, определение которого показано ниже:Как объявить соответствующий размер для буфера
#ifdef _UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
Мне нужно поставить некоторые данные в буфер 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
- точная буферную емкость для реальных потребностей (меньше, если не Юникод не определен, больше, если юникод определяется)? Кроме того, я хотел бы защитить себя от возможности переполнения буфера, какую защиту я должен использовать?
Более того, я объявил здесь буфер как char
. Если я объявлю буфер как int
, будет ли разница в значении размера (в 4 раза меньше по сравнению с объявленным как char)?
UPDATE
То, что я придумал частично на основе Маты Петерсона ответ:
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;
Правильно ли мышление или я что-то пропустил?
'buff [размер * sizeof (TCHAR)/sizeof (char)]'? –
@Luchian Grigore: Нет, размер - это то, о чем я на самом деле спрашиваю - хочу узнать, как рассчитывается значение размера, исходя из того, что я знаю, какие данные будут переданы в него (данные: '' % s (ID:% i) ", res-> name(), res-> id()'). – jwaliszko