1

指定された配列から次の出力を取得しようとしています

 Apples      200   Grapes      900 Bananas  Out of stock
 Grapefruits 2     Blueberries 100 Orangess Coming soon
 Pears       10000

これが私がこれまでに思いついたものです(私はそれをやり過ぎているように感じます)、しかし、私はまだ列を埋めるときに何かが欠けています。私はこれにアプローチする方法についての提案を受け入れます。

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

#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
char *fruits[][2] = {
    {"Apples", "200"},
    {"Grapes", "900"},
    {"Bananas", "Out of stock"},
    {"Grapefruits", "2"},
    {"Blueberries", "100"},
    {"Oranges", "Coming soon"},
    {"Pears", "10000"},
};

int get_max (int j, int y) {
    int n = ARRAY_SIZE(fruits), width = 0, i;
    for (i = 0; i < n; i++) {
        if (i % j == 0 && strlen(fruits[i][y]) > width) {
            width = strlen(fruits[i][y]);
        }
    }
    return width;
}

int main(void) {
    int n = ARRAY_SIZE(fruits), i, j;
    for (i = 0, j = 1; i < n; i++) {
        if (i > 0 && i % 3 == 0) {
            printf("\n"); j++;
        }
        printf("%-*s ", get_max(j, 0), fruits[i][0]);
        printf("%-*s ", get_max(j, 1), fruits[i][1]);
    }
    printf("\n"); 
    return 0;
}

現在の出力:

Apples      200          Grapes      900          Bananas     Out of stock 
Grapefruits 2            Blueberries 100          Oranges     Coming soon  
Pears       10000 
4

2 に答える 2

2

幅の計算が間違っています。基本的に、特定の列の幅を計算できるようにする必要があります。したがって、get_max関数では、列を指定できるはずです。次に、インデックスmod 3が列と等しいかどうかに基づいて、リストから要素を選択できます。これは、次のように実行できます。

int get_max (int column, int y) {
    ...
        if (i % 3 == column /* <- change */ && strlen(fruits[i][y]) > width) {
    ...
}

次に、メインループで、現在の列に基づいて列の幅を選択します。これを行うには、インデックスmod3を使用します。

for (i = 0, j = 1; i < n; i++) {
    ...
    printf("%-*s ", get_max(i % 3 /* change */, 0), fruits[i][0]);
    printf("%-*s ", get_max(i % 3 /* change */, 1), fruits[i][1]);
}

これは期待どおりに機能するはずです。

于 2012-11-25T06:26:10.983 に答える
0

私はあなたの論理を理解しようとはしませんが、「\ t」の付いたタブを使用してデータの間隔を空けることができると思います:

printf("%s \t %d","banana", 200);
于 2012-11-25T06:25:23.037 に答える