2014-10-06 97 views
0

我需要在字符串之前添加可变空格填充。下面的代码:printf中的空格填充不起作用

unsigned int spaces = result % 16; 
printf("spaces=%d\n", spaces); // spaces=12, for example. 
printf("% *s\n", spaces, my_string); 

它根本不起作用 - 空间不会添加和我得到以下警告在GCC:

warning: ' ' flag used with ‘%s’ gnu_printf format [-Wformat=]

如何解决呢?有没有解决方法?

+0

@ user3121023谢谢。我只是发现这也会起作用''printf(“%* s”“%s \ n”,空格,“”,my_string);' – python 2014-10-06 23:55:24

+0

你有什么和'(“%* s%s \ n“,空格,”“,my_string)'。相邻的琴弦静静地结合在一起。 – alexis 2014-10-06 23:57:19

+1

请注意,也可以选择填充空格长度达到设置的总长度的字符串,即printf(“%* s”,(int)spaces,my_string);'。在'%'之后使用'-'来左对齐(默认是右对齐) – 2014-10-07 00:06:08

回答

2

更改此

printf("% *s\n", spaces, my_string); 

这个

printf("%*s%s\n", spaces, " ", my_string); 

这应该摆脱警告,并给予应有的效果。

[编辑]

我现在看到你已经找到了答案。亚历克西斯说什么也是正确的,并会产生同样的效果。亚历克西斯的版本更清晰,我会说,所以我把这个作为一个解决方案,但是信用在他身上。

你也可以做这样的事情:

int width = 5; 
printf ("%*d%*d\n", width, 10, width, 12); 

这将打印:

10 12

Source

所以,如果你仔细想想,你会这样:

printf("%*s\n", spaces, "foo");


为什么亚历克西斯的版本是你的评论版本的同义词?

因为编译器会将两个连续的字符串(即两者之间的空白)串联到一个。

此操作被称为字符串文字串联。阅读更多Wikipedia

+0

是的,这就是为什么我不喜欢什么时候有人写好答案作为评论:)我会接受这个,因为有人在我想,未来会更容易找到它。 – python 2014-10-07 00:02:43

+0

起初我没有找到Alexis建议的@python版本,但是和你一样。然后我看到了亚历克西斯的版本(并且你同时评论了(如果我是正确的)版本),我测试了亚历克西斯的版本,并且看到它是正确的,更清洁,因此我编辑了这个问题。 :) – gsamaras 2014-10-07 00:05:01