如何在C中对齐这样的数字?

我需要将C中的一系列数字与printf()对齐,如下例所示:

-------1 -------5 ------50 -----100 ----1000 

当然,所有这些之间都有数字,但它与手头的问题无关……哦,将破折号视为空格,我使用破折号,因此更容易理解我想要的东西。

我只能做到这一点:

 ----1--- ----5--- ----50-- ----100- ----1000 

或这个:

 ---1 ---5 --50 -100 1000 

但这一切都不是我想要的,我只能使用printf()来实现第一个例子中显示的内容。 有可能吗?

编辑:
对不起的人,我匆忙,并没有很好地解释自己…我的最后一个例子和你的所有建议(使用像“%8d”这样的东西)不起作用,因为虽然最后一个数字是1000但它没有对于那件事,必须一直到1000甚至100或10。

无论要显示的位数,我最多只需要4个前导空格作为最大数字。 假设我必须显示从1到1000(A)和1到100(B)的数字,我使用“%4d”,这将是输出:

A:

 ---1 .... 1000 

哪个是我想要的输出…

B:

 ---1 .... -100 

这不是我想要的输出,我实际上想要这个:

 --1 ... 100 

但就像我说的,我不知道我必须打印的确切数字,它可以有1位数,它可以有2个,3个或更多,该函数应该为所有人准备。 我想要四个额外的前导空间,但那并不相关。

编辑2:似乎我想要的东西,我需要它的方式,这是不可能的(查看David Thornley和Blank Xavier的回答和我的评论)。 谢谢大家的时间。

在我方便的哈比森和斯蒂尔看这个….

确定字段的最大宽度。

 int max_width, value_to_print; max_width = 8; value_to_print = 1000; printf("%*d\n", max_width, value_to_print); 

请记住,max_width必须是int类型才能使用星号,并且您必须根据您想要拥有的空间来计算它。 在您的情况下,您将必须计算最大数字的最大宽度,并添加4。

为什么是printf("%8d\n", intval); 不适合你? 这应该…

您没有显示任何“不工作”示例的格式字符串,所以我不确定还有什么要告诉您。

 #include  int main(void) { int i; for (i = 1; i <= 10000; i*=10) { printf("[%8d]\n", i); } return (0); } $ ./printftest [ 1] [ 10] [ 100] [ 1000] [ 10000] 

编辑:对澄清问题的回应:

 #include  int maxval = 1000; int width = round(1+log(maxval)/log(10)); ... printf("%*d\n", width, intval); 

宽度计算计算日志基数10 + 1,它给出了位数。 花哨*允许您将变量用于格式字符串中的值。

您仍然必须知道任何给定运行的最大值,但在任何语言或铅笔和纸张中都无法解决。

  printf("%8d\n",1); printf("%8d\n",10); printf("%8d\n",100); printf("%8d\n",1000); 

尝试转换为字符串,然后使用“%4.4s”作为格式说明符。 这使它成为固定宽度格式。

据我所知,你想要的填充量会根据你拥有的数据而有所不同。 因此,唯一的解决方案是在打印前扫描数据,找出最宽的数据,然后使用asterix运算符找到可以传递给printf的宽度值,例如

 loop over data - get correct padding, put into width printf( "%*d\n", width, datum ); 

那么,你想要一个8字符宽的字段,空格作为填充? 试试“%8d”。 这是一个参考 。

编辑 :你要做的不是单独用printf处理的东西,因为它不知道你写的最长的数字是什么。 在执行任何printfs之前,您需要计算最大数字,然后计算出要用作字段宽度的位数。 然后你可以使用snprintf或类似的方法在现场制作printf格式。

 char format[20]; snprintf(format, 19, "%%%dd\\n", max_length); while (got_output) { printf(format, number); got_output = still_got_output(); } 

如果您无法提前知道宽度,那么您唯一可能的答案将取决于将输出暂存在某种临时缓冲区中。 对于小型报告,只收集数据并推迟输出直到输入有界将是最简单的。

对于大型报告,如果收集的数据超出合理的内存范围,则可能需要中间文件。

获得数据后,可以使用每个值的惯用法printf("%*d", width, value)将其后处理到报表中。

或者,如果输出通道允许随机访问,您可以继续编写报告草稿,假定(短)默认宽度,并在违反宽度假设的任何时候搜索并编辑它。 这也假定您可以以某种无害的方式填充该字段之外的报表行,或者您愿意通过读取 – 修改 – 写入过程替换目前的输出并放弃草稿文件。

但除非你能提前预测正确的宽度,否则如果没有某种forms的双通算法,就不可能做到你想要的。

查看编辑过的问题,您需要找到要显示的最大数字中的位数,然后使用sprintf()生成printf()格式,或使用%*d和作为int传递的位数为*然后是值。 一旦你获得了最大的数字(并且你必须事先确定),你可以用’整数对数’算法确定数字的位数(在你到零之前可以除以10的次数),或者通过使用缓冲区长度为零的snprintf() ,字符串的格式为%d和null; 返回值告诉您将格式化多少个字符。

如果你不知道并且无法确定它出现之前的最大数量,你就会被嘲笑 – 你无能为力。

 #include int main() { int i,j,n,b; printf("Enter no of rows "); scanf("%d",&n); b=n; for(i=1;i<=n;++i) { for(j=1;j<=i;j++) { printf("%*d",b,j); b=1; } b=n; b=bi; printf("\n"); } return 0; }