同等对齐字符串

时间:2016-09-16 03:17:30

标签: c

我正在尝试将这些字符串与各自的索引对齐。字符串看起来像这样:

char *mystrings[] = {"Fred", "Augustine", "Bob", "Lenny", "Ricardo"};

我的输出如下:

Fred 0
Augustine 1
Bob 2
Lenny 3
Ricardo 4

但我追求的是这样的事情:

Fred       0
Augustine  1
Bob        2
Lenny      3
Ricardo    4

因此索引对齐相同。我只是想让它更具可读性。这是我的代码到目前为止的样子:

#include <stdio.h>
#include <stdlib.h>

int
main(void) {
    int i;
    char *mystrings[] = {"Fred", "Augustine", "Bob", "Lenny", "Ricardo"};

    for (i = 0; i < 5; i++) {
        printf("%s %d\n", mystrings[i], i);
    }

    return 0;
}

有没有办法可以做到这一点?比如将索引与最长的字符串进行比较,然后为这样的整数创建空格?

3 个答案:

答案 0 :(得分:6)

计算最大宽度的额外循环,然后使用* printf标志从参数中取宽度(乘以-1以引起左对齐)

char *mystrings[] = {"Fred", "Augustine", "Bob", "Lenny", "Ricardo"};
int width = 0;
for (int i = 0; i < sizeof(mystrings)/sizeof(char*); i++) {
    width = strlen(mystrings[i]) > width? strlen(mystrings[i]) : width;
}

for (int i = 0; i < sizeof(mystrings)/sizeof(char*); i++) {
    printf("%*s %d\n", -1 * width, mystrings[i], i);
}

答案 1 :(得分:2)

您需要在格式规范中指定字符串的宽度 然后,您需要使用-说明符来指示您希望输出左对齐。

使用

printf("%-10s %d\n", mystrings[i], i);

将为mystrings[i]使用10个字符,并将保证输出的合理性。

如果您不知道字符串的长度,那么对这样的数字进行硬编码就会出问题。为了使您的程序有点健壮,您可以计算字符串的最大长度,然后从中计算格式字符串。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXSIZE 5

int main(void) {
   int i;
   char *mystrings[MAXSIZE] = {"Fred", "Augustine", "Bob", "Lenny", "Ricardo"};

   int maxLen = 0;
   for (i = 0; i < MAXSIZE; i++) {
      int len = strlen(mystrings[i]);
      maxLen = (len > maxLen) ? len : maxLen;
   }

   char formatString[50];
   sprintf(formatString, "%%-%ds %%d\n", maxLen + 1);

   for (i = 0; i < MAXSIZE; i++) {
      printf(formatString, mystrings[i], i);
   }

   return 0;
}

输出

Fred       0
Augustine  1
Bob        2
Lenny      3
Ricardo    4

答案 2 :(得分:2)

您需要做的是达到字符串的最大长度。您可以获取字符串的最大长度,然后使用一些简单的算法来计算您需要多少填充(字符串末尾的空格)。不使用printf,出于教育目的,我会告诉你如何做到这一点。

输出:

Fred      0
Augustine 1
Bob       2
Lenny     3
Ricardo   4

以下是一个例子:

#include <stdio.h>
#include <string.h>

static size_t max_len(const char * const data[], size_t size) {
    size_t i = 0;
    size_t max = strlen(data[0]);

    for(i = 1; i < size; i++) {
        size_t len = strlen(data[i]);

        if(len > max) {
            max = len;
        }
    }
    return max;
}

int main(void) {
    const char *const mystrings[] = {
        "Fred", "Augustine", "Bob", "Lenny", "Ricardo"
    };

    size_t m = max_len(mystrings, 5);
    size_t i;

    for(i = 0; i < 5; i++) {
        const char *item = mystrings[i];
        size_t len = strlen(item);
        size_t padding = 0;
        /* +1 for padding byte */
        if(len + 1 < m) {
           padding = m - len;
        }

        printf("%s ", item);

        size_t ii;

        for(ii = 0; ii < padding; ii++) {
            fputc(' ', stdout);
        }

        printf("%zu\n", i);
    }

    return 0;
}