C 挂钩Printf-like函数并修改输出

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

我正在钩住类似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", 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,添加一些没有上下文的代码不是最好的方法。请花点时间详细说明您的答案,并解释正在发生的事情。