printf中可变大小的填充

时间:2010-11-09 11:50:37

标签: c formatting printf

有没有办法在printf中使用可变大小的填充?

我有一个整数,表示填充的大小:

void foo(int paddingSize) {
    printf("%...MyText", paddingSize);
}

这应该打印出### MyText,其中paddingSize应该决定'#'符号的数量。

5 个答案:

答案 0 :(得分:46)

是的,如果您在格式字符串中使用*,它会从参数中获取一个数字:

printf ("%0*d\n", 3, 5);

将打印“005”。

请记住,您只能使用空格或零填充。如果你想用其他东西填充,你可以使用类似的东西:

#include <stdio.h>
#include <string.h>
int main (void) {
    char *s = "MyText";
    unsigned int sz = 9;
    char *pad = "########################################";
    printf ("%.*s%s\n", (sz < strlen(s)) ? 0 : sz - strlen(s), pad, s);
}

###MyText为9时输出sz,或MyText为2时输出sz(无填充但不截断)。您可能需要添加pad太短的支票。

答案 1 :(得分:1)

要小心 - 至少一些编译器(这可能是一般的C事物)并不总能做你想做的事情:

char *s = "four";
printf("%*.s\n", 5, s); // Note the "."

这会打印5个空格;

char *s = "four";
printf("%*s\n", 3, s);  // Note no "."

这会打印所有四个字符“四”

答案 2 :(得分:1)

你可以这样写:

void foo(int paddingSize) {
       printf ("%*s",paddingSize,"MyText");
}

答案 3 :(得分:0)

printf( "%.*s", paddingSize, string );

例如:

const char *string = "12345678901234567890";
printf( "5:%.*s\n", 5, string );
printf( "8:%.*s\n", 8, string );
printf( "25:%.*s\n", 25, string );

显示:

5:12345
8:12345678
25:12345678901234567890

答案 4 :(得分:0)

更好地使用std :: cout

using namespace std;
cout << setw(9)                       //set output width
     << setfill('#')                  // set fill character
     << setiosflags(ios_base::right)  //put padding to the left
     << "MyText";

应产生:

###MyText