使用sprintf将字符串中的字符添加到其他字符串时出现意外输出

时间:2015-12-23 03:20:39

标签: c arrays printf loadrunner

我有一个日期字符串,格式为yyyymmdd。我需要找出日,月,年并将它们存储在单独的字符串中并进一步使用它们。 我写了以下代码

self.newPos.setX(min(self.rect.right()-self.boundingRect().right(), max(self.newPos.x(), self.rect.left())))
self.newPos.setY(min(self.rect.bottom()-self.boundingRect().bottom(), max(self.newPos.y(), self.rect.top())))

return self.newPos

但输出结果是

  

日是21122015

     

月是122015

     

年是2015年

也许这是一个愚蠢的问题,但我是C的新手。有人可以解释一下这个原因吗?

1 个答案:

答案 0 :(得分:1)

根据C11标准,章节§7.21.6.6,sprintf()函数,(强调我的

  

sprintf函数等效于fprintf,但输出被写入   数组(由参数s指定)而不是流。 写入空字符   在写的字符的末尾; [...]

表示,如果是

sprintf(day, "%c%c", date[6], date[7]);

day应该为3 char分配最小空间,包括要写入的终止空值。现在,在您的情况下,它没有终止null的空间,因此,sprintf()尝试写入已分配的内存区域,并调用undefined behavior

在定义数组时,您还需要考虑终止空值的空间分配。

其他阵列也是如此。