截至目前,我正在使用以下行打印出点的
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打印短划线或点?
答案 0 :(得分: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);
你甚至可以在一个声明中做到这一点,有一些信念的飞跃:
printf("%s%s[%d]", title, padder + strlen(title), data);
答案 1 :(得分:9)
您可以使用iostreams而不是printf
轻松完成此操作cout << setw(40) << setfill('.') << left << tag[i] << '[' << data[i] << ']' << endl;
或者如果你真的需要使用fprintf(比如,你传递了一个文件*来写)
strstream str;
str << setw(40) << setfill('.') << left << tag[i] << '[' << data[i] << ']' << endl;
printf(%s", str.str());
答案 2 :(得分: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列中启动数据。
答案 3 :(得分:2)
您将不得不自己输出带点或短划线的字符串。
有点像(原谅我的C,它生锈了):
printAmount(char *txt, int amt) {
printf("%s",txt);
for(int xa=strlen(txt); xa<40; xa++) { putc('.'); }
printf("[%d]",amt);
printf("\n");
}
答案 4 :(得分: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发布的内容,但我实际上已经自己解决了这个问题;)
答案 5 :(得分:1)
我建议编写一个函数来填充带有X个字符的字符串,并使用它来生成printf
字符串的第一个参数。类似的东西:
char s[40];
pad_str(tag, s, 40, '.');
fprintf( stdout, "%-40s[%d]", s, data);
请注意,示例数据的第三行需要以下格式:
"%-40s[%s]"
答案 6 :(得分: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 "));
}