【问题标题】:way to send strings to stdout AND socket in 1 line在 1 行中将字符串发送到标准输出和套接字的方法
【发布时间】:2010-01-23 13:38:30
【问题描述】:

我只想写到 1 行:

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

所以我想将相同的字符串发送到标准输出和我打开的套接字。我该怎么做?

【问题讨论】:

    标签: c linux unix stdout


    【解决方案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]);
    

    【讨论】:

    • Bug:第一次将 ap 传递给 vfprintf() 后,您应该重新启动它。你可能不这样做,但标准是明确的(7.15):对象 ap 可以作为参数传递给另一个函数;如果该函数使用参数 ap 调用 va_arg 宏,则调用函数中 ap 的值是不确定的,应在进一步引用 ap 之前将其传递给 va_end 宏。
    【解决方案2】:

    除非您想编写自己的函数,该函数需要两个 File* 和 varargs,并调用 fprintf 两次。

    【讨论】:

      【解决方案3】:

      我猜你想这样做是为了把它放在类似 while 循环条件的东西中?您可能喜欢 C 逗号运算符,例如

      while ( f1(), f2() ) { //bla }

      逗号导致 f1() 被执行,它的返回值被丢弃,然后是 f2() 并保留它的返回值。 (即 f2() 应该返回一个 int 或 bool 而 f1() 无关紧要)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-10
        相关资源
        最近更新 更多