截至目前我使用下面符合出点的打印

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

我期待的输出将像以下,

Number of cards..................................[500]
Fixed prize amount [in whole dollars]............[10]
Is this a high winner prize?.....................[yes]

如何使用fprintf / printf的打印出短划线或点?

有帮助吗?

解决方案

一个更快的方法:

如果你将永远需要预先已知填充的最大数量(这通常是当你喜欢的格式你有一个固定宽度表的情况下),则可以使用一个静态“填补器”字符串,然后抢了一块出来。这将是比调用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);

其他提示

可以容易地与输入输出流,而不是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());

您不能做在一个声明。 你可以用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中的数据

您将不得不为输出与点或短划线填充自己的字符串。

喜欢的东西(原谅我的C,它的生锈):

printAmount(char *txt, int amt) {
    printf("%s",txt);
    for(int xa=strlen(txt); xa<40; xa++) { putc('.'); }
    printf("[%d]",amt);
    printf("\n");
    }

使用一个很小的辅助函数的另一种溶液

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

实际上,这就是阿泰贴,但其实我想通了这一点对我自己;)

我建议编写垫与X字符的字符串的函数,并用它来产生的第一个参数的printf字符串。是这样的:

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

请注意您的采样数据的第三行需要此格式:

"%-40s[%s]"

我觉得有一个更好的办法。

#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 "));
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top