8

截至目前,我正在使用下面的行打印不带点的

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

我期望输出将类似于以下内容,

卡数..................................[500]
固定奖金金额[整数]............[10]
这是中奖的高额奖金吗?......................[是]

如何使用 fprintf/printf 打印出破折号或圆点?

4

7 回答 7

10

更快的方法:

如果您事先知道您需要的最大填充量(当您格式化固定宽度的表格时通常会出现这种情况),您可以使用静态“填充器”字符串,只需从中抓出一大块。这将比调用printfcout循环更快。

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);

你甚至可以在一个声明中做到这一点,带着一些信念:

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

您可以使用 iostreams 而不是 printf 轻松做到这一点

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

你不能在一个声明中做到这一点。您可以使用 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' padder 概念简化了我上面的例子。这种方式不需要任何“信念的飞跃”,关于标签字符串是太大还是太小 - 它总是从第 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);

请注意,示例数据的第三行需要这种格式:

"%-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 回答