我想寫這個只有1行:發送串stdout和插座1行的方式
fprintf(stdout, "RCPT TO: <%s>\r\n", argv[argc-1]);
fprintf(sockfd, "RCPT TO: <%s>\r\n", argv[argc-1]);
,所以我想相同的字符串發送到標準輸出和我打開插座。我怎樣才能做到這一點?
我想寫這個只有1行:發送串stdout和插座1行的方式
fprintf(stdout, "RCPT TO: <%s>\r\n", argv[argc-1]);
fprintf(sockfd, "RCPT TO: <%s>\r\n", argv[argc-1]);
,所以我想相同的字符串發送到標準輸出和我打開插座。我怎樣才能做到這一點?
隨着
#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]);
錯誤:您應該在第一次將它傳遞給vfprintf()後重新啓動ap。你可能不這樣做,但標準是明確的(7.15):對象ap可以作爲參數傳遞給另一個函數;如果該函數調用具有參數ap的va_arg宏,調用函數中ap的值將是不確定的,並應在任何進一步引用ap之前傳遞給宏va_end 宏。 – 2010-01-23 16:56:41
謝謝@Steve和Jonathan!答案已更新。 – 2010-01-24 03:24:24
除非你想編寫自己的函數,它需要兩個File *和可變參數,並且調用fprintf兩次。
我猜你想這樣做,把它裏面的東西像一個while循環的條件?您可能會喜歡C逗號運算符,例如
而(F1(),F2()){// BLA}
的逗號引起F1()將被執行,它的()丟棄返回值,其次是F2和它的返回值保存。 (即f2()應該返回一個int或bool而f1()並不重要)
你怎麼不能? – 2010-01-23 13:41:03