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

截至目前,我正在使用下面的线来打印出点

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

我期待输出会像下面这样,

卡数.................................. [500]
固定奖金额[以美元计算] ............ [10]
这是一个高赢家奖?..................... [是]

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

更快的方法:

如果您需要的最大填充量是预先知道的(通常情况下,您正在格式化固定宽度表,就像您所拥有的那样),您可以使用静态“padder”字符串并且只是抓住一大块。 这比在循环中调用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); 

您可以使用iostream而不是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的padder概念简化了上面的示例。 这种方式不需要任何“信念的飞跃”,关于标签字符串是太大还是太小 – 它始终在第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); 

这基本上是Ates发布的内容,但实际上我自己想出来了;)

我建议编写一个函数来填充带有X个字符的字符串,并使用它来生成printf字符串的第一个参数。 就像是:

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

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

 "%-40s[%s]" 

我认为有更好的方法。

 #include  #include  #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 ")); }