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