如何在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; }