2012-10-27 48 views
4

我在C99中编写了一个Multiprecision库。根据我的代码编译的平​​台,我选择了不同的表示基础。例如,假设在平台X上系统选择BASE = 100;并在平台Y上BASE = 10000;C99 printf中的变量前导零号

比方说,我代表大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表示​​的数字阵列将是(little-endian的形式):

12|34|56|0|2|67|89 
     ^^ I want ONE LEADING ZEROES 

而在BASE-10000:

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

有没有简单的方法来做到这一点?

回答

6

阅读关于*占位符为man printf的字段宽度的占位符。

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

042 

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

<39 spaces>alk 
+1

谢谢,这正是我一直在寻找。 –

+1

我实际上做的是定义一个宏,像LOG10_BASE,并在printf中使用它,正如你所建议的那样'printf(“%0 * d”,LOG10_BASE,A-> digits [0]);' –

+0

请注意, C标准或POSIX强制使用空格修饰符和字符串(严格来说,行为是不确定的);它用有符号和无符号数字定义它的行为。您也可以使用'printf(“%。* d”,3,42)'来打印'042'; C99标准的理由表明委员会更喜欢这一点(尽管'0'修饰符也适用)。 –