2012-04-23 94 views
0

我可以在我的函數ptr * Os_printf * 中打印2個以上的參數,但我的函數僅適用於1個參數。參數列表中的函數指針

例如 - >

Os_printf("Moon %d %d",55,5); 

OUT:

月55 5

#include <stdio.h> 
#include <stdlib.h> 
#include <stdarg.h> 

char db[50]; 

void test_1(int (*debug)()) 
{ 
    debug("JOY %d %d \n",4,55); 
} 

volatile int (*ptr_fscreener)(char * __restrict, const char * __restrict, ...); 

void Os_formater(int (*debug)()) 
{ 
    ptr_fscreener=debug; 
} 

void Os_printf(const char * __restrict out,void**d) 
{ 
va_list args; 
char db[50]; 
ptr_fscreener(db,out,d); 
puts(db); 
} 

int main(void) { 
    Os_formater(sprintf); 
    Os_printf("Moon %d",55); 
    test_1(printf); 
    puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */ 
    return EXIT_SUCCESS; 
    } 


/******* OUTPUT For example ******/ 
     Moon 55 
     JOY 4 55 
     !!!Hello World!!! 
+2

如果你問,答案很簡單:HTTP:// WWW。 gnu.org/software/libc/manual/html_node/Variadic-Functions.html,但你的措辭是一個陳述,而不是一個問題,所以很難說。 – tbert 2012-04-23 23:31:00

回答

3

您需要使用<stdarg.h>,可能vsnprintf(),在衆多的其他變化:

#include <stdio.h> 
#include <stdlib.h> 
#include <stdarg.h> 

void test_1(int (*debug)(const char *format, ...)) 
{ 
    debug("JOY %d %d\n",4,55); 
} 

static int (*ptr_fscreener)(char *, size_t, const char *, va_list); 

void Os_formatter(int (*debug)(char *buffer, size_t buflen, const char *format, va_list args)) 
{ 
    ptr_fscreener = debug; 
} 

void Os_printf(const char *out, ...) 
{ 
    va_list args; 
    char db[50]; 
    va_start(args, out); 
    ptr_fscreener(db, sizeof(db), out, args); 
    va_end(args); 
    puts(db); 
} 

int main(void) 
{ 
    Os_formatter(vsnprintf); 
    Os_printf("Moon %d",55); 
    test_1(printf); 
    puts("!!!Hello World!!!"); 
    return EXIT_SUCCESS; 
} 

只要正確使用它,使用vsnprintf()可以爲緩衝區溢出提供一些保護。這是相當簡單的恢復使用vsnprintf();我認爲不可能可靠地使用snprintf()sprintf()

編譯:

gcc -O3 -g -std=c99 -Wall -Wextra va.c -o va 

結果: 「我怎麼做我自己的可變參數函數」

Moon 55 
JOY 4 55 
!!!Hello World!!! 
+0

你定義了'char db [50];'兩次 - 你需要更早的定義嗎?在您滿意地解決這一問題之後,我會提高您的答案。 – Blaisorblade 2012-04-23 23:42:54

+0

@Blaisorblade:不需要全局變量'db';它是未使用的。我忘了刪除它。我唯一的藉口是原來的(這不是一個很好的藉口),它沒有造成任何傷害(這也不是一個很好的藉口,無論如何都是準確的)。 – 2012-04-23 23:53:45

+0

你說得對,我沒有注意到。你有我的投票。 – Blaisorblade 2012-04-23 23:57:32