我有一个日期字符串,格式为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的新手。有人可以解释一下这个原因吗?
答案 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。
在定义数组时,您还需要考虑终止空值的空间分配。
其他阵列也是如此。