【问题标题】:Variable leading zeroes in C99 printfC99 printf中的可变前导零
【发布时间】:2012-10-27 13:58:26
【问题描述】:

我正在用 C99 编写一个多精度库。根据编译我的代码的平台,我选择不同的表示基础。

例如,假设在平台 X 上系统选择 BASE=100;在平台上 Y BASE=10000;

假设我代表 big 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 表示中,digits 数组将是(小端形式):

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

在 BASE-10000 中:

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

有简单的方法吗?

【问题讨论】:

    标签: c printf


    【解决方案1】:

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

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

    给予

    042
    

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

    给予

    <39 spaces>alk
    

    【讨论】:

    • 谢谢,这正是我想要的。
    • 我实际上所做的是定义一个宏,例如 LOG10_BASE,并在 printf 中使用它,正如您所建议的 printf("%0*d",LOG10_BASE,A-&gt;digits[0]);
    • 请注意,C 标准和 POSIX 都没有要求使用带字符串的空格修饰符(严格来说,行为是未定义的);它用有符号和无符号数字定义其行为。您也可以使用printf("%.*d", 3, 42) 打印042; C99 标准的基本原理表明委员会更喜欢这一点(尽管0 修饰符也有效)。
    猜你喜欢
    • 1970-01-01
    • 2016-01-15
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多