C99 printf中的可变前导零
我在C99写了一个Multiprecision Library。 根据我的代码编译的平台,我选择不同的表示基础。
因此,例如,假设在平台X上系统选择BASE = 100; 在平台上Y BASE = 10000;
假设我代表大的unsigned int如下:
typedef struct a { big_enough_uint *digits; unsigned int length; unsigned int last; } bigUint;
所以,当我在BASE-100系统上时,我想要我的打印function
void my_print(bigUint *A){ unsigned int i=0; fprintf(stdout,"%d",A->digits[0]); if(i!= A->last){ for(;ilast;i++) fprintf(stdout,"%02d",A->digits[i]); } printf(stdout,"\n"); }
在BASE-10000系统上,我希望它是这样的
void my_print(bigUint *A){ unsigned int i=0; fprintf(stdout,"%d",A->digits[0]); if(i!= A->last){ for(;ilast;i++) fprintf(stdout,"%04d",A->digits[i]); } printf(stdout,"\n"); }
我为什么要这样做?
假设我有以下数字:
12345600026789
在BASE-100表示中,数字数组将是(小端forms):
12|34|56|0|2|67|89 ^ ^ I want ONE LEADING ZEROES
在BASE-10000中:
12|3456|2|6789 ^ I want THREE LEADING ZEROES
有一个简单的方法吗?
阅读man printf
字段宽度的*
占位符。
printf("%0*d", 3, 42);
给
042
和
printf("% *s", 42, "alk");
给
<39 spaces>alk