web-dev-qa-db-ja.com

printfの可変サイズのパディング

printfに可変サイズのパディングを設定する方法はありますか?

パディングの大きさを示す整数があります。

void foo(int paddingSize) {
    printf("%...MyText", paddingSize);
}

これにより、### MyTextが出力され、paddingSizeが「#」記号の数を決定する必要があります。

27
Egil

はい、フォーマット文字列で*を使用すると、引数から数値が取得されます。

printf ("%0*d\n", 3, 5);

「005」を出力します。

スペースまたはゼロでのみ埋めることができることに注意してください。他のもので埋めたい場合は、次のようなものを使用できます。

#include <stdio.h>
#include <string.h>
int main (void) {
    char *s = "MyText";
    unsigned int sz = 9;
    char *pad = "########################################";
    printf ("%.*s%s\n", (sz < strlen(s)) ? 0 : sz - strlen(s), pad, s);
}

これは、szが9の場合は###MyTextを出力し、MyTextが2の場合はszを出力します(パディングなし、切り捨てなし)。 padが短すぎるかどうかのチェックを追加することをお勧めします。

48
paxdiablo

ただし、注意してください-少なくとも一部のコンパイラ(これは一般的なCのことかもしれません)は、必ずしもあなたが望むことをするわけではありません:

char *s = "four";
printf("%*.s\n", 5, s); // Note the "."

これは5つのスペースを印刷します。

char *s = "four";
printf("%*s\n", 3, s);  // Note no "."

これにより、4文字すべてが「4」で印刷されます。

1
cflute

あなたはこのように書くことができます:

void foo(int paddingSize) {
       printf ("%*s",paddingSize,"MyText");
}
1
Quixotic
printf( "%.*s", paddingSize, string );

例えば:

const char *string = "12345678901234567890";
printf( "5:%.*s\n", 5, string );
printf( "8:%.*s\n", 8, string );
printf( "25:%.*s\n", 25, string );

表示:

5:12345
8:12345678
25:12345678901234567890
0
Graeme Perrow

std :: coutをよりよく使用する

using namespace std;
cout << setw(9)                       //set output width
     << setfill('#')                  // set fill character
     << setiosflags(ios_base::right)  //put padding to the left
     << "MyText";

生成する必要があります:

###MyText
0
Valerii Stankov