我正在 Hook 类似 printf 的函数,其定义如下:
int Con_Printf(const char *format, ...)
我想检查给定的字符串是否在参数内或最终格式化的字符串中,如果存在,则将其替换为另一个字符串,但我有以下代码将参数传递给原始函数:
va_list args;
char *parg;
va_start(args, format);
vasprintf(&parg, format, args);
va_end(args);
(*conprint)("%s", parg);
free(parg);
是 (*conprint) 原始的 Con_Printf 函数。
如何查看应用了格式的字符串(即将参数替换为占位符)以替换我需要的内容,而不仅仅是传递所有参数?
示例: 该程序调用 Con_Printf("%s %s", "foo", "bar"),我想知道在我的 Con_Printf Hook 中“bar”是否在参数内,但我不知道有多少个参数,因为Con_Printf 的“, ...)”定义。
如果在参数中找到“bar”,则将其替换为“baz”并转发修改后的调用 (*conprint)("%s %s", "foo", "baz")(用 baz 替换 bar )。 (*conprint)("foo baz") 也能做到这一点。
谢谢!
最佳答案
我想,你想要的是va_arg()
。查看手册页here 。您可能需要
vasprintf()
- 一次取出一个参数
- 执行所需的检查和操作
- 然后将它们放在一起进行最终
conprint
。
从手册页来看,历史设置是:
#include <varargs.h>
void foo(va_alist)
va_dcl
{
va_list ap;
va_start(ap);
while (...) {
...
x = va_arg(ap, type);
...
}
va_end(ap);
}
您需要根据提供的格式说明符选择类型
关于c - Hook 类似 Printf 的函数并修改输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27354946/