36

この例のように、Cの一連の数値をprintf()に揃える必要があります。

-------1
-------5
------50
-----100
----1000

もちろん、それらの間には数字がありますが、目前の問題には関係ありません...ああ、ダッシュをスペースと見なし、ダッシュを使用したので、私が欲しいものを理解しやすくなりました。

私はこれを行うことができるだけです:

----1---
----5---
----50--
----100-
----1000

またはこれ:

---1
---5
--50
-100
1000

しかし、これは私が望んでいることではなく、printf()だけを使用して最初の例に表示されているものを実現することはできません。それは可能ですか?

編集:
申し訳ありませんが、私は急いでいて、自分自身をうまく説明しませんでした...私の最後の例とすべての提案(「%8d」のようなものを使用する)は機能しません。そのことについては、必ずしも1000、さらには100または10に達するとは限りません。

表示する桁数に関係なく、最大数の先頭のスペースは最大4つだけにします。1から1000(A)と1から100(B)の数字を表示する必要があり、両方に「%4d」を使用すると、次のようになります。

A:

---1
....
1000

これが私が欲しい出力です...

B:

---1
....
-100

これは私が望む出力ではありません、私は実際にこれが欲しいです:

--1
...
100

しかし、私が言ったように、私が印刷しなければならない数字の正確な数はわかりません、それは1桁、2、3、またはそれ以上である可能性があり、関数はすべてのために準備されるべきです。そして、4つの追加の先頭スペースが必要ですが、それはそれほど重要ではありません。

編集2: 私が望むもの、私がそれを必要とする方法、それは不可能であるようです(DavidThornleyとBlankXavierの回答と私のコメントを確認してください)。いつもありがとうございました。

4

11 に答える 11

53

なぜprintf("%8d\n", intval);あなたのために働いていないのですか?そうすべき...

「機能しない」例のフォーマット文字列を表示していないため、他に何を伝えればよいかわかりません。

#include <stdio.h>

int
main(void)
{
        int i;
        for (i = 1; i <= 10000; i*=10) {
                printf("[%8d]\n", i);
        }
        return (0);
}

$ ./printftest
[       1]
[      10]
[     100]
[    1000]
[   10000]

編集:質問の明確化への応答:

#include <math.h>
int maxval = 1000;
int width = round(1+log(maxval)/log(10));
...
printf("%*d\n", width, intval);

幅の計算では、対数底 10 + 1 が計算され、桁数が得られます。ファンシー*により、フォーマット文字列の値に変数を使用できます。

特定の実行の最大値を知る必要がありますが、どの言語または鉛筆と紙でもそれを回避する方法はありません。

于 2009-04-16T19:23:03.560 に答える
50

私の便利な Harbison & Steele でこれを調べると....

フィールドの最大幅を決定します。

int max_width, value_to_print;
max_width = 8;
value_to_print = 1000;
printf("%*d\n", max_width, value_to_print);

max_width はint、アスタリスクで機能するタイプである必要があり、必要なスペースの量に基づいて計算する必要があることに注意してください。あなたの場合、最大数の最大幅を計算し、4 を追加する必要があります。

于 2009-04-16T20:14:47.757 に答える
4
    printf("%8d\n",1);
    printf("%8d\n",10);
    printf("%8d\n",100);
    printf("%8d\n",1000);
于 2009-04-16T19:26:41.053 に答える
2

では、パディングとしてスペースを含む 8 文字幅のフィールドが必要ですか? 「%8d」を試してください。ここに参照があります

編集:あなたがしようとしていることは、あなたが書いている最長の数がわからないため、printfだけで処理できるものではありません。printfs を実行する前に最大数を計算し、フィールドの幅として使用する桁数を計算する必要があります。次に、snprintf などを使用してその場で printf 形式を作成できます。

char format[20];
snprintf(format, 19, "%%%dd\\n", max_length);
while (got_output) {
    printf(format, number);
    got_output = still_got_output();
}
于 2009-04-16T19:23:35.930 に答える
1

文字列に変換してから、書式指定子として "%4.4s" を使用してみてください。これにより、固定幅形式になります。

于 2009-04-16T21:43:43.657 に答える
0

質問からわかる限り、必要なパディングの量は、持っているデータによって異なります。したがって、これに対する唯一の解決策は、印刷前にデータをスキャンして、最も幅の広いデータを見つけ出し、アスタリスク演算子を使用して printf に渡すことができる幅の値を見つけることです。

loop over data - get correct padding, put into width

printf( "%*d\n", width, datum );
于 2009-04-16T20:18:20.697 に答える
0
#include<stdio.h>
int main()
{
 int i,j,n,b;
 printf("Enter no of rows ");
 scanf("%d",&n);
 b=n;
 for(i=1;i<=n;++i)
 {
    for(j=1;j<=i;j++)
    {
        printf("%*d",b,j);
        b=1;
    }
        b=n;
    b=b-i;
    printf("\n");


 }
 return 0;
}
于 2013-11-28T18:37:45.130 に答える
0

事前に幅がわからない場合、考えられる唯一の答えは、出力を何らかの一時バッファーにステージングすることです。小さなレポートの場合、データを収集し、入力が制限されるまで出力を延期するのが最も簡単です。

大規模なレポートの場合、収集されたデータが妥当なメモリ範囲を超えると、中間ファイルが必要になることがあります。

データを取得したら、printf("%*d", width, value)各値のイディオムを使用してレポートに後処理するのは簡単です。

または、出力チャネルがランダム アクセスを許可している場合は、(短い) デフォルト幅を想定したレポートのドラフトを作成し、幅の想定に違反するたびにそれを探して編集することもできます。これはまた、無害な方法でそのフィールドの外側にレポート行を埋め込むことができるか、または読み取り-変更-書き込みプロセスによってこれまでの出力を置き換えてドラフト ファイルを破棄しても構わないと思っていることも前提としています。

ただし、事前に正しい幅を予測できない限り、何らかの形式の 2 パス アルゴリズムがなければ、目的を達成することはできません。

于 2009-04-16T21:05:34.653 に答える
0

編集された質問を見て、表示される最大数の桁数を見つけてから、 を使用してprintf()フォーマットを生成するsprintf()か、または%*dの int として渡される桁数を使用して、*次に値を使用してフォーマットを生成する必要があります。最大の数を取得したら (事前に決定する必要があります)、「整数対数」アルゴリズムを使用して桁数を決定できます (0 になる前に 10 で何回割ることができますか)、または文字列snprintf()のバッファ長ゼロ、フォーマット%dおよび null で使用する。戻り値は、フォーマットされた文字数を示します。

出現する前に最大数を知らず、決定できない場合は、スヌーカーです。何もできません。

于 2009-04-16T22:01:58.763 に答える
0
fp = fopen("RKdata.dat","w");
fprintf(fp,"%5s %12s %20s %14s %15s %15s %15s\n","j","x","integrated","bessj2","bessj3","bessj4","bessj5");
for (j=1;j<=NSTEP;j+=1)
    fprintf(fp,"%5i\t %12.4f\t %14.6f\t %14.6f\t %14.6f\t %14.6f\t %14.6f\n",
    j,xx[j],y[6][j],bessj(2,xx[j]),bessj(3,xx[j]),bessj(4,xx[j]),bessj(5,xx[j]));
fclose(fp);
于 2020-11-09T15:16:47.370 に答える