gpt4 book ai didi

c - 在 sprintf() 之前解析并替换 NaN 值

转载 作者:行者123 更新时间:2023-12-03 02:21:01 25 4
gpt4 key购买 nike

因此,我的低级 _fconvert() 函数存在编译器错误,供应商已将其标记为低优先级,但结果是,如果我向 printf() 样式发送 NaN 值,嵌入式系统将崩溃功能。我想为 sprintf() 编写一个包装器来解析 float ,如果它们是 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 */

最佳答案

过滤对 *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 的所有调用时,这才有效。如果它们深埋在您无法控制的代码中,您很可能必须采取更困难的路线来替换标准库的整个 block 。

关于c - 在 sprintf() 之前解析并替换 NaN 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46097121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com