Передача неопределённого списка параметров
От: King of a Stellar War Украина  
Дата: 08.01.05 20:18
Оценка:
Даров, народ!

Есть процедура типа:


void func(char *s,.../*отсюда*/)
{
   char buf[100];
   sprintf(buf,s,/*сюда*/);
}


Как передать параметры все параметры полученные из ... в sprintf?

Всем, спасибо


11.01.05 07:38: Перенесено модератором из 'C/C++. Прикладные вопросы' — Павел Кузнецов
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Re: Передача неопределённого списка параметров
От: c-smile Канада http://terrainformatica.com
Дата: 08.01.05 20:24
Оценка: 3 (1)
King of a Stellar War, смотри

int vprintf(const char *format, va_list args);
Re: Передача неопределённого списка параметров
От: Dr.Gigabit  
Дата: 08.01.05 21:05
Оценка: 2 (1)
Здравствуйте, 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 >>
Re: Передача неопределённого списка параметров
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 09.01.05 06:55
Оценка:
Здравствуйте, King of a Stellar War, Вы писали:

KOA>Как передать параметры все параметры полученные из ... в sprintf?


http://gzip.rsdn.ru/forum/Message.aspx?mid=941015
Автор:
Дата: 10.12.04
Re: Передача неопределённого списка параметров
От: Аноним  
Дата: 27.02.05 07:07
Оценка: 24 (2)
Здравствуйте, 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;
};
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.