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
有没有简单的方法来做到这一点?
谢谢,这正是我一直在寻找。 –
我实际上做的是定义一个宏,像LOG10_BASE,并在printf中使用它,正如你所建议的那样'printf(“%0 * d”,LOG10_BASE,A-> digits [0]);' –
请注意, C标准或POSIX强制使用空格修饰符和字符串(严格来说,行为是不确定的);它用有符号和无符号数字定义它的行为。您也可以使用'printf(“%。* d”,3,42)'来打印'042'; C99标准的理由表明委员会更喜欢这一点(尽管'0'修饰符也适用)。 –