2016-09-16 77 views
4

我想將這些字符串與它們各自的索引對齊。該字符串是這樣的:平等對齊字符串

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; 
} 

有沒有辦法我可以做到這一點?像比較索引與最長的字符串,然後爲這些整數做空間?

+7

請參見[printf手冊頁](http:// lin ux.die.net/man/3/printf) – kaylum

+2

爲什麼在'char * mystrings [MAXSIZE]中使用'MAXSIZE'''讓編譯器執行這個工作,例如'char * mystrings [] ,,,' –

+0

@EdHeal my壞。我會改變這一點。 – RoadRunner

回答

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); 
} 
+0

這是做到這一點的最佳方式。 –

2

您需要爲格式規範中的字符串指定寬度。
然後,您需要使用-說明符來指示您希望輸出左對齊。

使用

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

將使用10個字符mystrings[i],將左對齊的輸出。

如果您不知道字符串的長度,那麼對這樣的數字進行硬編碼將會成爲問題。爲了讓你的程序有一點健壯,你可以計算字符串的最大長度,然後從中計算出格式字符串。

#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 
+0

從我能看到的很好的解決方案,但沿着動態格式字符串的路徑,在我看來,是C程序員應該避免的東西,除非絕對必要。 –

+0

@自己避免動態格式字符串的任何特定原因? (除了它們可能難以閱讀)((並且映射到nethack中的蝨子..或流氓,我忘了)) – Tibrogargan

+2

@Tibrogargan如果只是發生格式字符串來自用戶輸入,它就成爲一個漏洞。這並不是說這就是這種情況,但總的來說,你不希望用戶輸入被用作格式字符串。 –

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; 
}