首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >有没有办法用sprintf填充包含格式化元素的char数组?

有没有办法用sprintf填充包含格式化元素的char数组?
EN

Stack Overflow用户
提问于 2018-05-31 04:32:26
回答 4查看 282关注 0票数 2

因此,我使用sprintf生成一个格式化的char[]来显示日期。

代码语言:javascript
复制
sprintf(lcdContent_line1, "%02d/%02d/%04d", month, day, year);

但我也希望整个结果正确填充空格,总长度为20个字符。我试过了:

代码语言:javascript
复制
sprintf(lcdContent_line1, "%-20s", lcdContent_line1);

但这就把整件事都搞砸了。有没有一种方法可以组成格式字符串,这样我就可以对整个内容进行右填充?

编辑:

LOLOL simple solution:

代码语言:javascript
复制
memset(lcdContent_line1, 0, 20);
sprintf(lcdContent_line1, "%02d/%02d/%04d", month, day, year);
sprintf(lcdContent_line1, "%-19s", lcdContent_line1);

结果发现我用%-20s溢出了缓冲区,因为这是整个长度,你必须为0留出空间。>.<

编辑2:

感谢@chux指出,事实上,这是一个糟糕的解决方案,它没有权利像它那样工作。未定义的行为地狱是一个真实的地方,在那里你会被送到第一个挑衅的迹象。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-05-31 04:35:37

你的第二个例子是错误的,因为输入和输出是重叠的(实际上,它们是同一个字符串),这是绝对不允许的。

您可以使用单独的缓冲区来修复它,并让sprintf填充您的字符串,或者您可能会想出更聪明的东西,例如

代码语言:javascript
复制
for(int i = sprintf(lcdContent_line1, "%02d/%02d/%04d", month, day, year);
    i < 20; ++i) lcdContent_line1[i] = ' ';
lcdContent_line1[20] = 0;

把它填在原处。

但老实说,在这种情况下,最简单的解决方案可能是

代码语言:javascript
复制
sprintf(lcdContent_line1, "%02d/%02d/%04d          ", month, day, year);
票数 3
EN

Stack Overflow用户

发布于 2018-05-31 04:52:12

我的建议

代码语言:javascript
复制
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

代码语言:javascript
复制
printf("%*d", width, num);
票数 4
EN

Stack Overflow用户

发布于 2018-05-31 05:05:52

除了Jacek Cz的答案(基于固定大小的日期格式)之外,您还可以使用%n来获取非固定格式的字符数。在输出中具有可变长度的单个整数值的示例中,请参见以下代码来演示这一点:

代码语言:javascript
复制
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);
}

输出:

代码语言:javascript
复制
012345678901234567890123456789
123567              |
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50612935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档