【问题标题】:sprintf() in c++ with conditional statements带有条件语句的 C++ 中的 sprintf()
【发布时间】:2012-12-18 03:21:23
【问题描述】:

我正在尝试使用 sprintf() 为 C++ 中的 arduino 项目格式化 char 数组 我的目标是将以下整数格式化:日、月、年、小时、分钟和秒为以下

DD/MM/YYYY HH:MM:SS

当整数小于 10 时出现我的问题

 sprintf (timeStr, "%c%u/%c%u/%u %c%u:%c%u:%c%u",(monthDay>0 && monthDay<=9)?'0':'',monthDay,(month>0 && month<=9)?'0':'',month,year,(hour>0 && hour<=9)?'0':'',hour,(minute>0 && minute<=9)?'0':'',minute,(second>0 && second<=9)?'0':'',second);

现在这不会编译,因为我得到“空字符常量”,我认为它来自 '' 没有合法值。

如果语句中的 %c 是有条件的并且我只想要一个值

如果有人对我如何实现这一点有任何见解,我将不胜感激,因为我真的坚持下去了!

谢谢!

【问题讨论】:

  • 查找 printf 格式并使用类似 "%02d" 来指定宽度为 2 左填充 0。
  • 如果 sprintf 不能工作,为什么不使用 strcat 代替,因为你不想在值

标签: c++ c arduino


【解决方案1】:

你说得对,%c 需要一个字符(顺便说一下,空的'' 不是,)。

但是,如果您使用零填充,只需使用格式说明符 "%02d"?这就是您通常获得零填充数字的方式。换句话说,使用:

sprintf (timeStr, "%02d/%02d/%04d %02d:%02d:%02d",
    monthDay, month, year, hour, minute, second);

许多嵌入式系统可能会排除浮点说明符(或将其设为可选)以保留空间,但零填充或空格填充整数是一个相当简单的操作,它们都应该具有。

如果你发现一个实现的缺陷支持它们,你可以使用字符串而不是字符,因为空字符串有效的:

sprintf (timeStr, "%s%d/%s%d/%d %s%d:%s%d:%s%d",
    (monthDay < 10) ? "0" : "",
    monthDay,
    :
    and so on ...

但我很确定 Arduino 并没有那么不足。

【讨论】:

  • 啊!谢谢,我的印象是它们只存在于基本类型,如 %d、%c、%lf 等,从我研究过的列表中并没有意识到它是从那里扩展的。我走错了方向,再次感谢您的澄清!
【解决方案2】:

%c 格式始终只需要一个字符,因此不允许使用 ''。您想要打印零或一个字符的内容。您可以为此使用 %s,并使条件表达式使用字符串文字而不是字符文字:(monthDay &gt; 0 &amp;&amp; monthDay &lt;= 9) ? "0" : ""

【讨论】:

  • 编辑:我误读了它使用 %s 而不是 %c 并且现在了解您的解决方案我在发布之前尝试过此解决方案,但您收到了一个编译器错误它需要一个 char 而不是 char 数组,我试图变得聪明并这样做:char *c = ""; (monthDay &gt; 0 &amp;&amp; monthDay &lt;= 9) ? "0" : c[0] 虽然实际上引用了 char 数组的 '/0' 空终止符,但它可以编译
猜你喜欢
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 2017-03-04
  • 2021-06-19
  • 2019-06-12
  • 2020-08-18
  • 2017-12-02
  • 2017-03-06
相关资源
最近更新 更多