因此,我使用sprintf生成一个格式化的char[]来显示日期。
sprintf(lcdContent_line1, "%02d/%02d/%04d", month, day, year);
但我也希望整个结果正确填充空格,总长度为20个字符。我试过了:
sprintf(lcdContent_line1, "%-20s", lcdContent_line1);
但这就把整件事都搞砸了。有没有一种方法可以组成格式字符串,这样我就可以对整个内容进行右填充?
编辑:
LOLOL simple solution:
memset(lcdContent_line1, 0, 20);
sprintf(lcdContent_line1, "%02d/%02d/%04d", month, day, year);
sprintf(lcdContent_line1, "%-19s", lcdContent_line1);
结果发现我用%-20s溢出了缓冲区,因为这是整个长度,你必须为0留出空间。>.<
编辑2:
感谢@chux指出,事实上,这是一个糟糕的解决方案,它没有权利像它那样工作。未定义的行为地狱是一个真实的地方,在那里你会被送到第一个挑衅的迹象。
你的第二个例子是错误的,因为输入和输出是重叠的(实际上,它们是同一个字符串),这是绝对不允许的。
您可以使用单独的缓冲区来修复它,并让
sprintf
填充您的字符串,或者您可能会想出更聪明的东西,例如
for(int i = sprintf(lcdContent_line1, "%02d/%02d/%04d", month, day, year);
i < 20; ++i) lcdContent_line1[i] = ' ';
lcdContent_line1[20] = 0;
把它填在原处。
但老实说,在这种情况下,最简单的解决方案可能是
sprintf(lcdContent_line1, "%02d/%02d/%04d ", month, day, year);
我的建议
int whatYouWant = 10 circa about;
sprintf(lcdContent_line1, "%02d/%02d/%04d%*c", month, day, year, whatYouWant, ' ');
更新:链接到documentation: https://linux.die.net/man/3/sprintf ,然后转到example
printf("%*d", width, num);
除了Jacek Cz的答案(基于固定大小的日期格式)之外,您还可以使用
%n
来获取非固定格式的字符数。在输出中具有可变长度的单个整数值的示例中,请参见以下代码来演示这一点:
int main() {
char x[50];
int nrOfChars=0;
sprintf(x,"%d%n",123567,&nrOfChars);
sprintf(x+nrOfChars,"%*c|",20-nrOfChars,' ');
printf("012345678901234567890123456789\n");
printf("%s\n",x);
}
输出:
012345678901234567890123456789