Действительно ли возможно передать вызов замещающего знака C через непосредственно?

void printLine(const wchar_t* str, ...) 
{
  // have to do something to make it work
  wchar_t buffer[2048];        
  _snwprintf(buffer, 2047, ????);
  // work with buffer
}

printLine(L"%d", 123);

Я попробовал

  va_list vl;
  va_start(vl,str);

и вещи как это, но я не нашел решение.

5
задан Totonga 2 February 2010 в 10:02
поделиться

4 ответа

Вот простой код C, который делает это, у вас будет включить stdarg.h, чтобы это работало.

void panic(const char *fmt, ...){
   char buf[50];

   va_list argptr; /* Set up the variable argument list here */

   va_start(argptr, fmt); /* Start up variable arguments */

   vsprintf(buf, fmt, argptr); /* print the variable arguments to buffer */

   va_end(argptr);  /* Signify end of processing of variable arguments */

   fprintf(stderr, buf); /* print the message to stderr */

   exit(-1);
}

Типичный вызов:

panic("The file %s was not found\n", file_name); /* assume file_name is "foobar" */
/* Output would be: 

The file foobar was not found

*/

Надеюсь, это поможет, С уважением, Том.

9
ответ дан 18 December 2019 в 09:07
поделиться

То, что вы хотите использовать vsprintf Это принимает аргумент VA_LIST , и есть образец Код на MSDN в ссылке.

Править: Вы должны рассмотреть _vsnPrintf , который поможет избежать проблем переполнения буфера, которые vsprintf будет счастливо создать.

5
ответ дан 18 December 2019 в 09:07
поделиться

Обычно один выводит в вариабельную версию функции, которая принимает va_list . Например _snwprintf Внутренние вызовы _vsnwprintf ; попробуйте назвать это.

2
ответ дан 18 December 2019 в 09:07
поделиться

Другие люди уже указали на вас в VPRINTF -FAMILY функций, но это также (не удивительно) отвечает PAQ COMP.LANG.C, если вы Хотите ознакомиться с другими записями FAQ. (Они стоят читать, IMO.)

Как я могу написать функцию, которая принимает строку формата и переменное количество аргументов, таких как printf, и передает их на printf, чтобы сделать большую часть работы?

2
ответ дан 18 December 2019 в 09:07
поделиться