8

今のところ、ドットなしで印刷するために以下の行を使用しています

fprintf( stdout, "%-40s[%d]", tag, data);

出力は次のようになると予想しています。

カード枚数.................................................................[500]
賞金の固定額 [ドル単位]........[10]
これは上位入賞ですか?................................[はい]

fprintf/printfを使用してダッシュまたはドットを出力するには?

4

7 に答える 7

10

より高速なアプローチ:

必要になるパディングの最大量が事前にわかっている場合(通常、既存のような固定幅のテーブルをフォーマットする場合)、静的な「パダー」文字列を使用できます。それからチャンクをつかみます。printfこれは、呼び出しやcoutループよりも高速になります。

static const char padder[] = "......................"; // Many chars

size_t title_len = strlen(title);
size_t pad_amount = sizeof(padder) - 1 - title_len;

printf(title); // Output title

if (pad_amount > 0) {
    printf(padder + title_len); // Chop!
}

printf("[%d]", data);

ある程度の信仰を持って、1つのステートメントでそれを行うこともできます。

printf("%s%s[%d]", title, padder + strlen(title), data);
于 2009-01-16T19:00:41.243 に答える
9

これは、printf の代わりに iostream を使用して簡単に実行できます。

cout << setw(40) << setfill('.') << left << tag[i] << '[' << data[i] << ']' << endl;

または、本当に fprintf を使用する必要がある場合 (たとえば、書き込み先の FILE* が渡されます)

strstream str;
str << setw(40) << setfill('.') << left << tag[i] << '[' << data[i] << ']' << endl;
printf(%s", str.str());
于 2009-01-16T19:43:29.957 に答える
3

1つのステートメントでそれを行うことはできません。sprintfを使用してから、自分でスペースの代わりにドットを使用するか、次のようにすることができます。

int chars_so_far;
char padder[40+1]= '..........'; //assume this is 40 dots.
printf("%.40s%n",tag,&chars_so_far);
printf("%s[%d]",padder+chars_so_far,data);

編集:@Atesのパダーの概念に基づいて上記の例を簡略化しました。この方法では、タグ文字列が大きすぎるか小さすぎるかについて、「信頼の飛躍」は必要ありません。常に列41のデータが開始されます。

于 2009-01-16T18:45:19.450 に答える
2

自分でドットまたはダッシュのパディングを使用して文字列を出力する必要があります。

(私のCを許してください、それはさびています)のようなもの:

printAmount(char *txt, int amt) {
    printf("%s",txt);
    for(int xa=strlen(txt); xa<40; xa++) { putc('.'); }
    printf("[%d]",amt);
    printf("\n");
    }
于 2009-01-16T18:39:21.473 に答える
2

小さなヘルパー関数を使用した別のソリューション

static inline size_t min(size_t a, size_t b)
{
    return a < b ? a : b;
}

次に、次の操作を実行できます。

char padder[] = "........................................";
int len = min(strlen(tag), sizeof(padder) - 1);
printf("%.*s%s[%d]", len, tag, padder + len, data);

これは本質的にAtesが投稿したものですが、私は実際にこれを自分で理解しました;)

于 2009-01-16T19:23:09.590 に答える
1

文字列にX文字を埋め込み、それを使用して文字列の最初の引数を生成する関数を作成することをお勧めしますprintf。何かのようなもの:

char s[40];
pad_str(tag, s, 40, '.');
fprintf( stdout, "%-40s[%d]", s, data);

サンプルデータの3行目には、次の形式が必要であることに注意してください。

"%-40s[%s]"
于 2009-01-16T18:49:13.717 に答える
0

もっと良い方法があると思います。

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

#define MIN(A,B) ((A)<(B)?(A):(B))
char *dashpad(char *buf, int len, const char *instr) {
    memset(buf, '-', len);
    buf[len] = 0;
    int inlen = strlen(instr);
    memcpy(buf, instr, MIN(len, inlen));
    return buf;
}
main() {
    char buf[40];
    printf("%s\n", dashpad(buf, 40, "Hello world, dash padded "));
}
于 2009-01-16T21:54:21.080 に答える