Alex Rivera | Logout

How to capture output of printf?

Asked 2012-06-19T22:17:16.743
9

I am calling a function funcB from funcA. funcB uses several printf statements to output data. Is there a way for me to capture that data via funcA? I can not modify funcB.

funcB(){
     printf( "%s", "My Name is" );
     printf( "%s", "I like ice cream" );
}

funcA(){
    funcB();
}
Edit
Report

2 Answers

2

If nothing else in your program uses printf, you can write your own version and link it explicitly. The linker will not look in the standard library if the function is already defined. You can probably use vsprintf for the implementation, or some safer version with overrun checking if it is supplied by your compiler.

answered 2012-06-19T22:28:53.370
1

If you're willing to play a dirty game interposing on printf you can 'steal' its output doing something like:

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

static char buffer[1024];
static char *next = buffer;

static void funcB(){
     printf( "%s", "My Name is" );
     printf( "%s", "I like ice cream" );
}

static void funcA(){
    funcB();
    // Do stuff iwth buffer here
    fprintf(stderr, "stole: %s\n", buffer);
    next=buffer; // reset for later.
}

int main() {
  funcA();
}


int printf(const char *fmt, ...) {
   va_list argp;
   va_start(argp, fmt);
   const int ret = vsnprintf(next, sizeof buffer-(next-buffer), fmt, argp);
   next += ret;
   va_end(argp);
   return ret;
}

You could use a flag to indicate how to handle the instances where you want printf to work as normal. (E.g. map it onto fprintf or use dlsym()/similar to find the real call).

You could also use realloc to manage the size of the buffer more sensibly.

answered 2012-06-19T22:34:38.370

Your Answer