sprintf() 正在添加一个额外的变量



为什么会这样?:

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之后。

最新更新