如何将以固定宽度填充空格的数字居中?

use*_*124 2 c printf

我正在尝试做这样的事情

对齐的数字

但我想不出有什么可以做到通用数字.看,我得到了数字可以容纳的最大空间(在这种情况下,长度是4).但是它里面的数字可以有任何小于或等于(空格 - 2)的长度,所以它可以适应而不会触及边界.我需要将每个方块中的数字居中,无论它有多少个字符.

我尝试了第一行这样的事情:

printf("    ");
for (i = 0; i < columns; i++) {
    printf(" ");
    printf("%*d", length, i);
    printf(" ");
}
Run Code Online (Sandbox Code Playgroud)

但它不会在中心对齐数字,而是在右边.我该怎么办?

小智 5

应该做的事情(检查错误):

#include <stdio.h>
#include <assert.h>

#define BUFSIZE 20

void print_centered(size_t width, int num) {
  char buffer[BUFSIZE];
  int len;
  int padding_left, padding_right;

  assert(width < BUFSIZE);

  len = snprintf(buffer, BUFSIZE, "%d", num);
  padding_left = (width - len) / 2;
  padding_right = width - len - padding_left;

  (void)snprintf(buffer, BUFSIZE, "%*d%*s", len + padding_left, num, padding_right, padding_right ? " " : "");
  printf("%s", buffer);
}

int main(int argc, char **argv) {
  printf("|");
  print_centered(10, 123);
  printf("|\n");

  printf("|");
  print_centered(10, 1234);
  printf("|\n");

  printf("|");
  print_centered(10, 1234567890);
  printf("|\n");

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

|   123    |
|   1234   |
|1234567890|
Run Code Online (Sandbox Code Playgroud)