为什么会这样?:
char buf[256];
char date[8];
sprintf(date, "%d%02d%02d", Time.year(), Time.month(), Time.day());
snprintf(buf, sizeof(buf), "{"team":"%s"}", team.c_str());
Serial.println(date);
输出:
20180202{"team":"IND"}
它应该只是:20180202
我不知道为什么{"team":"IND"}
被添加到它的末尾。
很可能你声明了两个数组,并且它们的排列方式允许buf
覆盖date
的空终止符,因此它">连接"了两者。
我无法编写代码来重现它,因为它是未定义的行为,因此不可靠。但我可以告诉你如何避免它,
snprintf(date, sizeof(date), "%d%02d%02d", Time.year(), Time.month(), Time.day());
snprintf(buf, sizeof(buf), "{"team":"%s"}", team.c_str());
话虽如此,当这似乎是 c++ 时,你为什么要使用snprintf()
?因此,对于此类问题,有更合适的解决方案。
这将打印不正确的值,但不会导致任何意外行为。
c 中的字符串只是具有特殊排列的数组。如果字符串有 n个可打印字符,则应将其存储在大小为n + 1的数组中,以便您可以添加所谓的null终止符。它是一个指示字符串末尾的特殊值。
您的第二个snprintf()
是覆盖date
数组的此类空终止符,从而似乎连接了两个字符串。
您已预留空间来存储正好 8char
秒:
char date[8];
要正确存储日期20180202
您需要
char date[9];
因为sprintf()
将额外的' '
字符放入您传递的缓冲区中,以便正确终止 C 样式字符串。
我怀疑你声明了你的缓冲区,比如
char buffer[???];
char date[8];
由于这些很可能存储在您的处理器堆栈上,因此您需要向后读取,因此放置在buffer
的输出会覆盖终止' '
,并立即出现在date
之后。