2010-01-23 22 views
0

我想寫這個只有1行:發送串stdout和插座1行的方式

fprintf(stdout, "RCPT TO: <%s>\r\n", argv[argc-1]); 
fprintf(sockfd, "RCPT TO: <%s>\r\n", argv[argc-1]); 

,所以我想相同的字符串發送到標準輸出和我打開插座。我怎樣才能做到這一點?

+0

你怎麼不能? – 2010-01-23 13:41:03

回答

5

隨着

#include <stdarg.h> 

int fprintf_both(FILE *a, FILE *b, const char *fmt, ...) 
{ 
    FILE *f[2]; 
    const int n = sizeof(f)/sizeof(f[0]); 
    int i; 
    int sum = 0; 

    f[0] = a; 
    f[1] = b; 

    for (i = 0; i < n; i++) { 
    va_list ap; 
    int bytes; 

    va_start(ap, fmt); 
    bytes = vfprintf(f[i], fmt, ap); 
    va_end(ap); 

    if (bytes < 0) 
     return bytes; 
    else 
     sum += bytes; 
    } 

    return sum; 
} 

可以

fprintf_both(stdout, sockfd, "RCPT TO: <%s>\r\n", argv[argc-1]); 
+0

錯誤:您應該在第一次將它傳遞給vfprintf()後重新啓動ap。你可能不這樣做,但標準是明確的(7.15):對象ap可以作爲參數傳遞給另一個函數;如果該函數調用具有參數ap的va_arg宏,調用函數中ap的值將是不確定的,並應在任何進一步引用ap之前傳遞給宏va_end 宏。 – 2010-01-23 16:56:41

+0

謝謝@Steve和Jonathan!答案已更新。 – 2010-01-24 03:24:24

1

除非你想編寫自己的函數,它需要兩個File *和可變參數,並且調用fprintf兩次。

0

我猜你想這樣做,把它裏面的東西像一個while循環的條件?您可能會喜歡C逗號運算符,例如

而(F1(),F2()){// BLA}

的逗號引起F1()將被執行,它的()丟棄返回值,其次是F2和它的返回值保存。 (即f2()應該返回一個int或bool而f1()並不重要)