Если вы готовы играть грязную игру вставляя на printf
вы можете «украсть» его выход делать что-то вроде:
#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;
}
Вы можете использовать флаг, чтобы указать, как обрабатывать случаи, когда вы хотите printf работать нормально. (Например, нарисуйте его на fprintf
или используйте dlsym()
/, чтобы найти реальный звонок).
Вы также можете использовать realloc
для более разумного управления размером буфера.
Что делать, если 'funcB' не выводит свой вывод, а возвращает его вместо' funcA'? Трудно сказать из абстрактного описания, как вы указали, быть более конкретным. – LihO
* «Это вопрос на C++» * - это больше похоже на вопрос C для меня. Если бы это был C++, вы могли бы сделать что-то вроде: [this] (http://stackoverflow.com/a/8076948/168175). – Flexo
Это больше похоже на OS-specfic вопрос для меня, о чем я упоминал в своем ответе. –