C 挂钩Printf-like函数并修改输出
我正在钩住类似printf的函数,它的定义如下:C 挂钩Printf-like函数并修改输出,c,printf,hook,variadic-functions,C,Printf,Hook,Variadic Functions,我正在钩住类似printf的函数,它的定义如下: int Con_Printf(const char *format, ...) va_list args; char *parg; va_start(args, format); vasprintf(&parg, format, args); va_end(args); char* replacedstr; replacedstr = str_replace(parg, "bar", "baz"); (*conprint)("%s
int Con_Printf(const char *format, ...)
va_list args;
char *parg;
va_start(args, format);
vasprintf(&parg, format, args);
va_end(args);
char* replacedstr;
replacedstr = str_replace(parg, "bar", "baz");
(*conprint)("%s", replacedstr);
free(parg);
我想检查给定字符串是否在参数内或最终格式化的字符串中,如果存在,然后用另一个字符串替换它,但我有以下代码将参数传递给原始函数:
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钩子中知道“bar”是否在参数中,但由于Con_Printf的“,…)”定义,我不知道有多少参数
如果在参数中找到“bar”,则将其替换为“baz”,并转发修改后的调用(*conprint)(“%s%s”、“foo”、“baz”)(将bar替换为baz)。(*conprint)(“foobaz”)也会起作用
谢谢 我想,你想要的是
va_arg()
。检查手册页。与其直接使用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);
}
#包括
void foo(va_-alist)
瓦乌dcl
{
va_列表ap;
va_启动(ap);
而(…){
...
x=va_arg(ap,类型);
...
}
va_端(ap);
}
您需要根据提供的格式说明符选择
类型
嗯,我想我忽略了字符串部分应该包含已格式化文本的事实,因此我可以直接在那里执行字符串操作以替换指针
所以,我的代码最终是这样结束的:
int Con_Printf(const char *format, ...)
va_list args;
char *parg;
va_start(args, format);
vasprintf(&parg, format, args);
va_end(args);
char* replacedstr;
replacedstr = str_replace(parg, "bar", "baz");
(*conprint)("%s", replacedstr);
free(parg);
用str_替换我在某处找到的一个很好的函数(我从来没有用C编写过代码,只是在做实验)。你应该初始化
parg=NULL代码>。顺便说一句,你的问题不清楚,所以编辑它。请给出一个预期行为的示例。格式化后查看字符串
的确切含义是什么?编辑以添加更多信息,@SouravGhosh,我的意思是能够在应用格式后操作字符串。我在搜索我的问题时读到了这一点;要做到这一点,我应该知道有多少个参数,因为这个数字是格式中占位符的计数。手动解析占位符将非常棘手,我不确定是否有其他方法可以在我无法使用的函数上使用此方法change@Rodrigo不,依我看,你不需要担心争论的数量。继续循环直到你得到一个有效的fmt
值。嗨@viewer,添加一些没有上下文的代码不是最好的方法。请花点时间详细说明您的答案,并解释正在发生的事情。