Printf根据其他打印值占用的空间打印空白

  • 本文关键字:打印 空间 空白 其他 Printf c
  • 更新时间 :
  • 英文 :


我正在用c做一个基于文本的小型RPG游戏,作为c的入门练习。

所以,我正在做一些打印,同时在这些打印里面打印一些整数。

目前,我的非常简单的例子看起来是这样的(为了这个例子,这只是硬编码的值(:

int myHealth = 200;
int monsterhealth = 200;
printf("       | You    |  Monster  | n");
printf("Health | %d    | %d       | n", myHealth, monsterhealth);

打印到此:

| You    |  Monster  | 
Health | 200    | 200       | 

但是,如果数字只有一个数字,比如1,那么它就有一个简单的问题,即文本变得有点偏移,比如这样:

| You    |  Monster  | 
Health | 1    | 1       | 

这似乎是一个非常简单的问题,我想我可以通过不使用这种方式来解决它,但现在我有点固执了。

当整数不占用那么多空间时,向字符串添加填充最干净的方法是什么?

您可以使用字段大小来指定一个数字(或字符串(应该占用多少空间——将添加空白使其(至少(达到这个大小。正数将在左侧添加空格(右对齐(,而负数将在右侧添加空格(左对齐(。所以你可以做一些类似的事情:

#define NUM_STATS 2
struct Character {
char *name;
int  stats[NUM_STATS];
};
const char *stat_names[NUM_STATS] = { "Health", "AC" };
// character[0] is the player, others are monsters
struct Character characters[MAX_CHARACTERS];
int num_characters;
void print_info() {
printf("%-8s |", "");
for (int i = 0; i < num_characters; ++i)
printf("%-4s |", character[i].name);
printf("n");
for (int s = 0; s < NUM_STATS; ++s) {
printf("%-8s |", stat_names[s]);
for (int i = 0; i < num_characters; ++i) {
int len = strlen(character[i].name);
if (len < 4) len = 4;
printf("%*d |", -len, character[i].stats[s]); }
printf("n");
}
}

如果你有太多的字符,这会被包裹起来(看起来很难看(,但你可以通过跟踪你的打印宽度(以及屏幕宽度(并在这种情况下拆分表格来解决这个问题。

添加填充的最干净方法是什么

确定每列的最小宽度,并通过"*"使用最小字段宽度。

使用"-"标志左对齐。

int myHealth = 200;
int monsterhealth = 200;
int cAt = 7;
int cYou = 7;
int cMon = 7;
printf("%*s | %-*s | %*s |n", //
cAt, "", cYou, "You", cMon, "Monster");
printf("%*s | %-*d | %*d |n", //
cAt, "Health", cYou, myHealth, cMon, monsterhealth);
printf("%*s | %-*d | %*d |n", //
cAt, "One", cYou, 1, cMon, 1);

样本输出

| You     | Monster |
Health | 200     |     200 |
One | 1       |       1 |

最新更新