2016-09-15 17 views
0

我嘗試重新注入變量ARG投功能:重新注入變量參數列表Ç郎

#include <stdio.h> 

    int test_va_arg(char * fmt, ...) { 
    int c; 

    c = printf(fmt); 

    return (c); 
    } 

int test_va_arg2(char * fmt, ...) { 
    int c; 
    char buf[1024]; 

    sprintf(buf, "ADD->%s", fmt); 
    c = printf(buf); 

    return (c); 
} 

int test_va_arg3(char * fmt, ...) { 
    int c; 
    char * buf; 

    buf = malloc(1024); 
    sprintf(buf, "ADD->%s", fmt); 
    c = printf(buf); 

    return (c); 
} 

int main(void) { 
    int c; 

    c = test_va_arg("test_va_arg : %d %d %d\n", 421, 847, 1003); 
    printf("test_va_arg2 :%d\n", c); 
    c = test_va_arg2("test_va_arg2 : %d %d %d\n", 421, 847, 1003); 
    printf("test_va_arg2 :%d\n", c); 
    c = test_va_arg3("test_va_arg3 : %d %d %d\n", 421, 847, 1003); 
    printf("test_va_arg2 :%d\n", c); 
    c = test_va_arg("test_va_arg : %d %d %d\n", 421, 847, 1003); 
    printf("test_va_arg2 :%d\n", c); 
    return (0); 
} 

輸出是

# ./test_va_arg 
test_va_arg : 421 847 1003 
test_va_arg2 :27 
ADD->test_va_arg2 : 4196615 178862877 2147483618 
test_va_arg2 :49 
ADD->test_va_arg3 : 4196615 13586477 2147483618 
test_va_arg2 :48 
test_va_arg : 421 847 1003 
test_va_arg2 :27 

我不爭論明白不是在堆棧上。 它似乎是與本地變量的鏈接。我想我必須移動堆棧指針,但我不知道該怎麼做。

+0

您傳遞變量函數參數,但你不打他們之前打電話給printf ...看看[本指南](https://www.tutorialspoint.com/c_standard_library/c_macro_va_start.htm) – LPs

+0

我不想彈出它們。我希望它會由下一個函數完成:printf在這個例子中。 – flav

+4

那麼你必須使用vprintf版本的函數。請參閱相應的手冊頁 – Serge

回答

1

您發表評論後,您必須使用vprinf像:

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

int test_va_arg(char * fmt, ...) 
{ 
    va_list args; 
    int c; 

    va_start(args, fmt); 
    c = vprintf(fmt, args); 
    va_end(args); 

    return (c); 
} 

int main(void) { 
    int c; 

    c = test_va_arg("test_va_arg : %d %d %d\n", 421, 847, 1003); 
    printf("test_va_arg2 :%d\n", c); 

    return (0); 
} 

其他意見後,你中央社使用宏來完成這項工作

#include <stdio.h> 

#define test_va_arg(fmt, ...) fprintf(stdout, fmt, ##__VA_ARGS__) 

int main(void) 
{ 
    int c; 

    c = test_va_arg("test_va_arg : %d %d %d\n", 421, 847, 1003); 
    printf("test_va_arg2 :%d\n", c); 

    return (0); 
}