我搜索过高和低,但在C中的printf中,似乎只有零填充和空白填充。我正在寻找自己的填充,在这种情况下使用星号。
例如,
假设宽度为8个字符。
输入:123
输出:**123.00
输入:3
输出:****3.00
我该怎么做?
答案 0 :(得分:7)
最简单的方法可能是使用带有空格填充的snprintf()
打印到缓冲区中,然后用星号替换空格:
void print_padded(double n)
{
char buffer[9];
char *p;
snprintf(buffer, sizeof buffer, "% 8.2f", n);
for (p = buffer; *p == ' '; p++)
*p = '*';
printf("%s", buffer);
}
答案 1 :(得分:2)
以下程序显示了一种方法:
#include <stdio.h>
#include <stdarg.h>
void padf (size_t sz, int padch, char *fmt, ...) {
int wid;
va_list va;
// Get the width that will be output.
va_start (va, fmt);
wid = vsnprintf (NULL, 0, fmt, va);
va_end (va);
// Pad if it's shorter than desired.
while (wid++ <= sz)
putchar (padch);
// Then output the actual thing.
va_start (va, fmt);
vprintf (fmt, va);
va_end (va);
}
int main (void) {
padf (8, '*', "%.2f\n", 123.0);
padf (8, '*', "%.2f\n", 3.0);
return 0;
}
只需调用padf
,就像调用printf
一样,但使用额外的前导宽度和填充字符参数,并更改“实际”格式以排除前导空格或零,例如更改{{ 1}}到%8.2f
。
它将使用标准变量参数stuff来计算参数的实际宽度,然后输出足够的填充字符,以便在输出实际值之前将其填充到所需的宽度。根据您的要求,上述程序的输出为:
%.2f
显然,这个解决方案在左边填充 - 你可以使它更通用,并且无论你是想要左边还是右边填充(对于数字/字符串),但这可能超出了问题的范围。
答案 2 :(得分:1)
使用snprintf
生成一个字符串,然后检查它的长度。对于尚未填充的任何字符,请在打印由snprintf
填充的实际缓冲区之前输出星号。
例如:
#define STRINGSIZE 8
char buffer[STRINGSIZE + 1];
int length = snprintf(buffer, sizeof(buffer), "%#.2f", floating_point_value);
for (int i = STRINGSIZE - length; i > 0; i--)
{
printf("*");
}
printf("%s\n", buffer);