C99 printf中的可变前导零

时间:2012-10-27 13:58:26

标签: c 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系统上时,我想要我的打印功能

void my_print(bigUint *A){
     unsigned int i=0;

     fprintf(stdout,"%d",A->digits[0]);
     if(i!= A->last){
          for(;i<=A->last;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(;i<=A->last;i++)
                fprintf(stdout,"%04d",A->digits[i]);
     }
     printf(stdout,"\n");
}

我为什么要这样做?

假设我有以下数字:

12345600026789

在BASE-100表示​​中,数字数组将是(小端形式):

12|34|56|0|2|67|89
         ^ ^ I want ONE LEADING ZEROES
在BASE-10000中

12|3456|2|6789
        ^ I want THREE LEADING ZEROES

有一种简单的方法吗?

1 个答案:

答案 0 :(得分:9)

*中了解字段宽度的man printf占位符。

printf("%0*d", 3, 42);

给出

042

printf("% *s", 42, "alk");

给出

<39 spaces>alk