【发布时间】:2011-05-07 04:58:50
【问题描述】:
有没有办法在printf 中设置可变大小的填充?
我有一个整数表示填充有多大:
void foo(int paddingSize) {
printf("%...MyText", paddingSize);
}
这应该打印出### MyText,其中 paddingSize 应该决定“#”符号的数量。
【问题讨论】:
标签: c formatting printf
有没有办法在printf 中设置可变大小的填充?
我有一个整数表示填充有多大:
void foo(int paddingSize) {
printf("%...MyText", paddingSize);
}
这应该打印出### MyText,其中 paddingSize 应该决定“#”符号的数量。
【问题讨论】:
标签: c formatting printf
是的,如果您在格式字符串中使用*,它会从参数中获取一个数字:
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);
}
当sz 为9 时输出###MyText,或者当sz 为2 时输出MyText(无填充但无截断)。您可能需要检查 pad 是否太短。
【讨论】:
* 字符之一。新版本已经过更彻底的检查。
你可以这样写:
void foo(int paddingSize) {
printf ("%*s",paddingSize,"MyText");
}
【讨论】:
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
【讨论】:
但要小心 - 至少某些编译器(这可能是通用的 C 语言)不会总是按照您的意愿行事:
char *s = "four";
printf("%*.s\n", 5, s); // Note the "."
这会打印 5 个空格;
char *s = "four";
printf("%*s\n", 3, s); // Note no "."
这会打印所有四个字符“四”
【讨论】:
更好地使用 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
【讨论】: