vsprintf是你在找什麼。它可以讓你編寫自己的類似sprintf的函數,它接受可變數量的參數,然後讓你在進行調用之前做你需要的。
這裏是我用它來實現自己的printf到USB端點在嵌入式設備中的例子:
#include <stdarg.h>
void uprintf(char *fmt, ...) {
va_list args;
va_start(args, fmt);
vsprintf(str_buffer, fmt, args);
usb_write(str_buffer);
va_end(args);
}
在你的情況,你可以「攔截」的格式調用vsprintf
,字符串並將自己的語法擴展爲適當的格式說明符語法,然後將新的格式說明符和變量arg列表傳遞到vsprintf
。
void your_printf(char *fmt, ...) {
char new_fmt_string[1024]; /* make sure you allocate enough space */
va_list args;
/* here, do your transformation on the fmt string */
va_start(args, new_fmt_string);
vsprintf(str_buffer, new_fmt_string, args);
/* now take your fully formatted string and do something with it */
/* then clean up */
va_end(args);
}
[下載開源實現](http://www.gnu.org/software/libc/download.html)'printf'並對其進行破解。 –
@JonathonReinhart然後被迫釋放你爲這個項目編寫的所有其他代碼,因爲它是一個「派生工作」。絕對沒有人可以反對!這就是說,對於OP來說,還有更多的寬鬆許可的stdio/libc在那裏;如果沒有別的,只需從其中一個BSD變體中抽取一個。 – tbert
夥計們,如果你真的認爲hacking printf是正確的方法,你真的需要檢查vsprintf。 –