在sprintf()

时间:2017-09-07 13:02:53

标签: c printf variadic-functions pic32

所以我有一个编译器错误,他们的低级_fconvert()函数供应商标记为低优先级,但结果是如果我将NaN值发送到printf()样式,嵌入式系统将崩溃功能。我想为sprintf()编写一个解析浮点数的包装器,如果它们是NaN值,它们将被宏值替换。我想我已经掌握了如何传递变量参数列表的基础知识,但不知道如何解析/替换。任何人都可以帮我吗?

int no_nan_sprintf(char *target_str, const char *format, ...)
{
    va_list args;

    va_start(args, format);

    //need help here, something like
    int idx;
    for (idx = 0; idx < sizeof(args); idx++)
    {
        if (isnan(args[idx]))
        {
            args[idx] = NAN_SUBSTITUTE_VALUE;
        }
    }

    //this should be tha call I want to make to sprintf
    sprintf(target_str, format, args);
    va_end(args);
}                  /* no_nan_sprintf */

1 个答案:

答案 0 :(得分:1)

过滤整个对*printf的调用所面临的天真的问题是,盲目地替换所有参数是不够的-您仅需要对浮点参数进行操作即可。

这意味着您需要智能地处理格式字符串本身,以确保您不修改指针或整数。

就确保不通过NaN而言,我选择更改以下内容:

printf ("Two floats and an int: %f %d %f\n", float1, int1, float2);

具有:

float fx(float f) { return isnan(f) ? 0 : f; }
printf ("Two floats and an int: %f %d %f\n", fx(float1), int1, fx(float2));

那样,您不必担心重新实现printf系列的所有硬细节,只需要过滤引起麻烦的特定变量即可。可以根据需要使fx函数复杂,例如使用宏而不是零,从而允许在每次调用时提供默认值,等等。

很明显,这只有在您可以更改所有传递NaN的呼叫时才有效。如果它们被深埋在您无法控制的代码中,那么您很可能必须走更困难的路线来替换标准库的整个块。