C言語関係掲示板

過去ログ

No773 printf活用と最大長自動算出

[戻る] [ホームページ]
No.9513

printf活用と最大長自動算出
投稿者---とおり(2003/10/01 14:46:41)


printfの多機能さを知って再勉強しています。
以下のような表示をprintfの機能でスマートに実現する方法はないでしょうか?
それぞれの長さを求めてスペースを手動挿入する方法しか思いつきませんでした。
    現在            理想
    (abcd   ): 0    (abcd)   : 0
    (efghijk): 1    (efghijk): 1
    (lmn    ): 2    (lmn)    : 2

もう1つ、これはprintf関連ではないのですが、
以下のソースでの7を、自分で数えずにマクロ等でコンパイル時に自動算出する方法はないでしょうか?
文字列が追加・削除され、最大長が変わったときに修正忘れがおこりそうだし、
かといって実行時に求めると無駄な処理になるからです。

#include <stdio.h>

#define ARRAYSIZE(array) (sizeof(array) / sizeof(array[0]))

const char *strtbl[] = {
    "abcd",
    "efghijk",
    "lmn",
};
const int maxlen = 7;        /* ※2 */

void main(void)
{
    int i;
    for (i = 0; i < ARRAYSIZE(strtbl); i++)
        printf("(%-*s): %d\n", maxlen, strtbl[i], i);        /* ※1 */
}


No.9514

Re:printf活用と最大長自動算出
投稿者---nop(2003/10/01 15:04:52)


>printfの多機能さを知って再勉強しています。
>以下のような表示をprintfの機能でスマートに実現する方法はないでしょうか?
>それぞれの長さを求めてスペースを手動挿入する方法しか思いつきませんでした。
> 現在 理想
> (abcd ): 0 (abcd) : 0
> (efghijk): 1 (efghijk): 1
> (lmn ): 2 (lmn) : 2

こんな感じでは?

const char *strtbl[] = {
    "abcd",
    "efghijk",
    "lmn",
};
int i;
int    maxlen = strlen(strtbl[0]);

for( i=1; i<sizeof(strtbl)/sizeof(strtbl[0]); i++ )
{
    maxlen = ( maxlen<strlen(strtbl[i]) ) ? strlen(strtbl[i]) : maxlen;
}
for( i=0; i<sizeof(strtbl)/sizeof(strtbl[0]); i++ )
{
    printf( "(%s)%*s: %d\n", strtbl[i], maxlen-strlen(strtbl[i]), "", i);
}


No.9515

Re:printf活用と最大長自動算出
投稿者---A(2003/10/01 17:07:56)


二回に分けてしまうとか。

#include <stdio.h>

#define ARRAYSIZE(array) (sizeof(array) / sizeof(array[0]))

const char *strtbl[] = {
    "abcd",
    "efghijk",
    "lmn",
};

const int maxlen = 7;

void main(void)
{
    int i;
    
    for (i = 0; i < ARRAYSIZE(strtbl); i++) {
        int len;
        len = 2 + maxlen - printf("(%s)", strtbl[i]);    /* +2は括弧分 */
        if (len < 0) len = 0;
        printf("%*s: %d\n", len, "", i);
    }
}