Даров, народ!
Есть процедура типа:
void func(char *s,.../*отсюда*/)
{
char buf[100];
sprintf(buf,s,/*сюда*/);
}
Как передать параметры все параметры полученные из ... в sprintf?
Всем, спасибо
11.01.05 07:38: Перенесено модератором из 'C/C++. Прикладные вопросы' — Павел Кузнецов
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Здравствуйте, King of a Stellar War, Вы писали:
KOA>Даров, народ!
KOA>Есть процедура типа:
KOA>KOA>void func(char *s,.../*отсюда*/)
KOA>{
KOA> char buf[100];
KOA> sprintf(buf,s,/*сюда*/);
KOA>}
KOA>
KOA>Как передать параметры все параметры полученные из ... в sprintf?
KOA>Всем, спасибо
Что у вас s обозначает?
вообще алгоритм такой:
va_list argptr;
/* инициализация argptr */
va_start(argptr, s);
Далее, как уже посоветовали, используем
vprintf( const char *format, va_list argptr )
... << RSDN@Home 1.1.4 @@subversion >>
Здравствуйте, King of a Stellar War, Вы писали:
KOA>Как передать параметры все параметры полученные из ... в sprintf?
http://gzip.rsdn.ru/forum/Message.aspx?mid=941015Автор:
Дата: 10.12.04
Здравствуйте, King of a Stellar War, Вы писали:
KOA>Даров, народ!
KOA>Есть процедура типа:
KOA>KOA>void func(char *s,.../*отсюда*/)
KOA>{
KOA> char buf[100];
KOA> sprintf(buf,s,/*сюда*/);
KOA>}
KOA>
KOA>Как передать параметры все параметры полученные из ... в sprintf?
KOA>Всем, спасибо
Для начала необходимо все Ваши параметры оформить в виде списка параметров, а затем предать их функции, которая работает не с эллипсисом (sprintf), а ее аналог, принимающая в качестве одного из параметров список параметров (vsnprintf).
void func(char *s,.../*отсюда*/)
{
// Выходной буфер.
char buf[100];
// Создадим список параметров
va_list paramList;
// Проинициализируем
va_start(paramList,s);
// Форматнем строку
vsnprintf(buf,s,paramList);
// Освободим список
va_end(paramList);
};
Все хорошо, но можно попасть на переполнение буфера. Для избежания переполнения, рекомендую использовать функцию _vsnprintf.
void func(char *s,.../*отсюда*/)
{
// Выходной буфер.
char buf[100];
// Создадим список параметров
va_list paramList;
// Проинициализируем
va_start(paramList,s);
// Форматнем строку
_vsnprintf(buff,100,s,paramList);
// Освободим список
va_end(paramList);
};
Но можно сделать еще хитрее, функция _vsnprintf позволяет вычислить размер результирующей строки. Для этого указатель на выходной буфер должен быть равен NULL. Поправим код.
void func(char *s,.../*отсюда*/)
{
// Указатель на выходной буфер.
char *buf;
// Создадим список параметров
va_list paramList;
// Проинициализируем
va_start(paramList,s);
// Узнаем размер результирующей строки.
size_t size=_vsnprintf(NULL,0x00,s,paramList);
// Выделим буфер необходимого размера, не забыв про нуль терминатор.
buf=new char[size+0x01];
// Форматнем строку
_vsnprintf(buff,size,s,paramList);
// Освободим список
va_end(paramList);
// Удалим буфер.
delete [] buf;
};