多次格式化输出与字符串中的回车冲突

lib中的name, author, publisher, date是四个字符串,其中每个date的末尾有一个'\n',为什么格式化输出多次后行与行之间不对齐?图片说明图片说明
图片说明补充说明:右对齐(即去掉符号)时不会出现这种错误。

由于最后一项date含有'\n',导致格式化的字符串各元素变成(以第一行为例),'2', '0', '0', '0', '\n', ' ', ' ', ' ', ' ', ' ',所以在和换行以后,多出的几个空格仍然要输出,所以第二行就不能顶格输出了。

具体原理:当printf在输出格式化字符串的时候,会维护一个内部指针,当printf逐步将格式化字符串的字符打印到屏幕,当遇到%的时候,printf会期望它后面跟着一个格式字符串,因此会递增内部字符串以抓取格式控制符的输入值。这就是问题所在,printf无法知道栈上是否放置了正确数量的变量供它操作,如果没有足够的变量可供操作,而指针按正常情况下递增,就会产生越界访问。甚至由于%n的问题,可导致任意地址读写。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^