【问题标题】:Easy way to determine argument type in argument list确定参数列表中参数类型的简单方法
【发布时间】:2012-11-29 11:35:43
【问题描述】:

我想要一个函数 debug_print(fmt, args),它接受格式字符串、参数并构建一个 char 缓冲区,然后我可以将其发送到 UART。基本上我可以将所有这些传递给scanf,但问题是格式化浮点数需要特别小心。

dtostrf( float_num, 3, 4, temp_buf );

所以我需要将格式字符串中的%f 替换为%s,并将float arg 更改为temp_buf。由于嵌入式环境功能有限,所有这些都必须以最少的步骤完成。

如果有人可以帮助构建这样的功能,将不胜感激。

类似这样的:

void debug_print(char *fmt, ... )
{
    va_list args;
    va_start(args,fmt);
    // use uart function for output
    va_end(args);
}

但是如何有效地遍历占位符以及如何将float arg 替换为char*

【问题讨论】:

  • 你为什么不简单地使用 vsprintf() 来为你做这项工作?
  • 如果您的资源有限,变量参数列表和 stdio.h 都是坏主意。事实上,在任何形式的确定性系统中,va_lists 都是一个坏主意:所有嵌入式系统当然都属于该类别。

标签: c embedded printf scanf avr


【解决方案1】:

当您找到"%f" 格式代码时,您可以使用dtostrf 函数转换下一个参数,而不是更改格式字符串(如果传递的字符串实际上是文字字符串,这将是不可能的),将值存储在一个临时的小字符串,然后将其连接到输出字符串(即strcat)。

【讨论】:

  • 所以我必须组织循环遍历 fmt 中的每个字符,然后自己实际将占位符转换为参数?能举个例子吗?
  • @Pablo 至少如果你不能使用例如vsprintf 那么你必须自己实现格式化。如果您稍微搜索一下,就会有很多可用的示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-25
相关资源
最近更新 更多