Nếu bạn sẵn sàng để chơi một trò chơi bẩn xen vào printf
bạn có thể 'ăn cắp' sản lượng của nó làm cái gì đó như:
#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;
}
Bạn có thể sử dụng một lá cờ để chỉ ra làm thế nào để xử lý các trường hợp mà bạn muốn printf hoạt động như bình thường. (Ví dụ: ánh xạ nó lên fprintf
hoặc sử dụng dlsym()
/tương tự để tìm cuộc gọi thực).
Bạn cũng có thể sử dụng realloc
để quản lý kích thước bộ đệm hợp lý hơn.
Điều gì sẽ xảy ra nếu 'funcB' không in đầu ra của nó, nhưng trả lại nó thành' funcA' thay thế? Khó nói từ mô tả trừu tượng như bạn đã cung cấp, cụ thể hơn. – LihO
* "Đây là câu hỏi C++" * - có vẻ giống như câu hỏi C đối với tôi. Nếu đó là C++ bạn có thể làm một cái gì đó như: [this] (http://stackoverflow.com/a/8076948/168175). – Flexo
Trông giống như một câu hỏi về hệ điều hành cho tôi, như được nói đến trong câu trả lời của tôi. –