在printf中用星号填充?

我搜索过高和低,但在C中的printf中,似乎只有零填充和空白填充。 我想写自己的填充,在这种情况下使用星号。

例如,

假设宽度为8个字符。

输入: 123输出: **123.00

输入: 3输出: ****3.00

我怎样才能做到这一点?

最简单的方法可能是使用带有空格填充的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); } 

以下程序显示了一种方法:

 #include  #include  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但使用额外的前导宽度和填充字符参数,并更改“实际”格式以排除前导空格或零,例如将%8.2f更改为%.2f

它将使用标准变量参数stuff来计算参数的实际宽度,然后输出足够的填充字符以在输出实际值之前将其填充到所需的宽度。 根据您的要求,上述程序的输出是:

 **123.00 ****3.00 

显然,这个解决方案填充在左侧 - 你可以使它更通用,并通过你是否想要左或右填充(数字/字符串),但这可能超出了问题的范围。

使用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);