【问题标题】:Align start and end of strings in C [duplicate]在C中对齐字符串的开始和结束[重复]
【发布时间】:2018-04-20 13:57:17
【问题描述】:

所以我想像这样对齐我的输出:

John Smith         Age: 34  Gender: M
Micheal Smith      Age:  9  Gender: F

等等

我有一个包含此信息的数组,我循环遍历它并打印信息:

for (int i = 0; i < ARRAY_LENGTH; i++) {

      printf ("%s       Age: %d  Gender: \n", person[i].name, person[i].age, person[i].gender);
}

我被困在如何让它对齐,所以所有的空间都是均匀的。

谢谢

【问题讨论】:

  • .name 是否有固定的最大值?
  • 您的示例printf() 缺少person[i].gender 的格式说明符,由于没有给出类型信息,因此不清楚这应该是%c 还是%s

标签: c string printf


【解决方案1】:

如果您查看 printf() 的手册,并注意您可以执行 %-18s 和 %2d 之类的操作 - 将字段宽度和对齐方式放在格式组中。

所以我会做类似的事情

printf("%-20s Age:%3d Gender: %1s",
       person[i].name, person[i].age, person[i].gender);

这应该很适合你。

【讨论】:

  • 很好奇使用":%3d" 不带空格,然后": %1s" 带空格。我希望"Age:%3d Gender:%2s""Age: %2d Gender: %1s"。 IAC,3 位数的年龄是有意义的。
  • @chux:我按照原始海报给出的示例进行操作,将数据保存在相同的列中。我认为将 3 位数的年龄溢出到左侧的下一列是“最不坏”的事情。
  • 我不相信%1s 能给你带来%s 没有的任何好处。如果您使用了%.1s,那么您最多可以将输出限制为 1 个字符,但是如果性别是空字符串(所以 person[i].gender[0] == '\0'),“至少一个”字符只会给您一个空格,所以也许有一个边际收益。
  • @JonathanLeffler 你说得对,它只对零长度的“性别”有帮助(这很容易想象,如果这个打印输出背后有一个数据库,并且有些人的性别不确定或“其他” )。它还用于记录预期的字段宽度。当我生成表格输出时,我只是习惯于在所有字段上指定宽度。
【解决方案2】:

如果您在 % 中添加宽度格式,那么您应该可以到达那里。所以你可以使用 %10s 和 %5d 之类的东西。 取决于你想要的数字空间。此外,您可能希望使用某种等宽字体。

【讨论】:

  • 等宽​​字体的要点。
【解决方案3】:

printf 允许您在格式说明符中指定填充,您可以将左侧填充的数量作为数字 x 提供,这样您的说明符看起来像 %xs,或者使用 -x 进行右侧填充,这样说明符看起来像%-xs

在您的情况下,您可以执行以下操作:

  printf ("%-20s Age: %5d Gender: %s\n", person[i].name, person[i].age, person[i].gender);

【讨论】:

    猜你喜欢
    • 2023-03-28
    • 2018-11-14
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    • 2020-04-05
    • 1970-01-01
    • 2021-11-12
    相关资源
    最近更新 更多