2014-02-26 59 views
0

我有參數AA可變數目的模塊C變量參數:傳遞起作用

int myprintf(const char *format, ... ){ 

} 

欲聲明局部字符數組,通過「myprint」參數的sprintf(),使得的sprintf( )將參數轉換爲字符數組,然後我可以使用該字符數組做一些事情。 通過這樣做,我不必重新發明sprintf的內部。

從理論上講:

int myprintf(const char *format, ... ) 

{ 
    char buf[ 512 ]; 

    sprintf(buf, format, ...); 

    // now do something with buf 

} 

我相信va_start(a, b)va_arg(c, d)感到有什麼作用。但va_arg似乎需要解析原始參數列表。

有什麼建議嗎?

+1

您正在使用C或C++? –

+2

如果我是對的,你正在尋找['vsnprintf'](http://en.cppreference.com/w/cpp/io/c/vfprintf)。 – chris

+1

@ user3346861:沒有「C/C++」這樣的語言。這個問題的好建議因語言而異。 –

回答

1

您可能正在尋找類似的東西:

void myprintf(const char *format, ... ) 
{ 
    char buf[ 512 ]; 

    va_list vl; 
    va_start (vl, format); 
    vsnprintf(buf, 511, format, vl); 
    va_end(vl); 

    // now do something with buf 
} 

Some other information is available in my answer here

當然上面的回答留下許多問題開放,比如我們將如何處理緩衝區溢出或此類。但這是另一回事。

+0

謝謝。這似乎是它! – user3356861

2

要闡述什麼克里斯說,是這樣的:

int vmyprintf(const char* format, va_list args) 
{ 
     char buf[512]; 

     vsnprintf(buf, sizeof(buf), fmt, args); 
     // now do something with buf 
} 

int myprintf(const char *format, ...) 
{ 
     va_list args; 
     int ret; 

     va_start(args, format); 
     ret = vmyprintf(format, args); 
     va_end(args); 
     return ret; 
} 
+1

這。任何可變參數函數都應該包裝'va_list'函數,以便其他人可以將其包裝。 – Medinoc

+0

謝謝,這工作正常。 – user3356861