スペースのある左パッドprintf


114

printfを使用するときに文字列の左側にスペースを埋め込むにはどうすればよいですか?

たとえば、「He​​llo」の前に40スペースを印刷したいとします。

また、印刷したい文字列は複数行で構成されています。各行を個別に印刷する必要がありますか?

編集:明確にするために、私はすべての行の前に正確に40スペースを印刷したいと思っています。

回答:


125

「Hello」という単語を、幅が40文字で、左側にスペースが埋め込まれている列に出力する場合は、以下を使用します。

char *ptr = "Hello";
printf("%40s\n", ptr);

それはあなたに35のスペースを与え、そして単語「こんにちは」を与えます。これは、列の幅がわかっているときにデータをフォーマットする方法ですが、データは変化します(まあ、それはそれを行う方法の1つです)。

正確に40スペースが必要であることがわかっている場合は、テキストを40スペースを定数に保存して印刷します。複数の行を印刷する必要がある場合はprintf、上記のような複数のステートメントを使用するか、ループの中でそれを行い、ptrそのたびに値を変更します。


3
フォーマットフラグについてはあまりにも多くのことがわかりません。しかし、私はprintf( "%40s%s \ n"、 ""、ptr);を疑っています。40スペースでそれを埋めるためにも使用できますか?
Johannes Schaub-litb 2008年

はい、それは常にポインタの内容の前に40スペースを与えるでしょう。これは良い解決策ですが、たくさんやらなければならない場合は、40スペースの定数の方が速いと思います。コンパイラーがprintf形式を最適化できるかどうかはわかりません。
リザードに請求する

38
また、含めるスペースの数を含むint変数 'n'がある場合は、次を使用できます。printf( "%* s%s \ n"、n、 ""、ptr); 可変数のスペースを取得します。
ジョナサンレフラー、

また、Qの最後の部分に対処するには、はい。データの各行を先頭に40個のスペースを付けて印刷する場合は、データをセグメント化して、各行を個別に印刷する必要があります。
ジョナサンレフラー

4
@ジョナサンレフラー:もちろんコンパイラはprintfフォーマットを最適化することができます。たとえば、GCCはprintf( "%s \ n"、foo)を最適化し、それをputs(foo)に置き換えます。
sam hocevar 2010年

73

この関数を使用して、出力をインデントします(たとえば、ツリー構造を印刷するため)。indent文字列の前のスペースの数です。

void print_with_indent(int indent, char * string)
{
    printf("%*s%s", indent, "", string);
}

7
文字列リテラル連結を使用して、インデントを残りのprintf形式から分離しておくのが好きです。1つの提案:インデント文字列には、単一のスペースの代わりに空の文字列を使用します。そうすれば、インデント== 0が期待どおりに機能します。(つまり、printf(..., indent, "", ...)
ɲeuroburɳ2015

Ray Hulhaが文字列リテラル連結を削除したことに注意してください。これは明らかに「コンパイラの問題」を修正するためです。
mwfearnley 2017年

42
int space = 40;
printf("%*s", space, "Hello");

このステートメントは、40文字の行を予約し、行の最後に文字列を出力します(行の全長が40で一定になるように余分なスペースを削除します)。次のように、文字と整数にも同じことが使用できます。

printf("%*d", space, 10);
printf("%*c", space, 'x');

パラメータを使用してスペースを決定するこの方法は、可変数のスペースが必要な場合に役立ちます。これらのステートメントは、次のように整数リテラルでも機能します。

printf("%*d", 10, 10);
printf("%*c", 20, 'x');
printf("%*s", 30, "Hello");

これが将来私のような人に役立つことを願っています。


私は得 error: empty character constant''。そうじゃないの' '
ジンクォン

はい、そうです。
shjeff 2018

@JinKwonどんなキャラクターで"Hello"も、彼は例を使うべきでした
ジョー・ペレティエ

19

文字列の前にちょうど40個のスペースが必要な場合は、次のようにします。

printf("                                        %s\n", myStr );

それがあまりにも汚い場合は、行うことができます(ただし、40のスペースを手動で入力するよりも遅くなります)。 printf("%40s%s", "", myStr );

文字列を40桁目に並べる場合(つまり、39までのスペースを空けて、右端の文字が40桁になるようにします)、次のようにします。 printf("%40s", myStr);

文字列の後に「最大」40スペースを置くこともできます。 printf("%-40s", myStr);


2
文字列の後にスペースのためのこのコメントのように
oneat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.