6

私はC99で多倍長ライブラリを書いています。コードがコンパイルされているプラ​​ットフォームに応じて、異なる表現ベースを選択しています。

したがって、たとえば、プラットフォームXでシステムがBASE=100を選択するとします。プラットフォームYBASE= 10000;

次のように、大きなunsignedintを表しているとしましょう。

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

それを行う簡単な方法はありますか?

4

1 に答える 1

10

*のフィールド幅のプレースホルダーについてお読みくださいman printf

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

与える

042

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

与える

<39 spaces>alk
于 2012-10-27T14:01:21.970 に答える