我正在用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 |