1

我正在尝试使用 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 是有条件的,我只想要一个值,如果它 <10 我只想要一个值

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

谢谢!

4

2 回答 2

7

你是对的,需要一个字符(顺便说一下,它不是%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 并没有那么缺陷。

于 2012-12-18T03:25:47.777 回答
1

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

于 2012-12-18T03:35:45.960 回答