我正在尝试进行修改 数字转换器。
我的工作正常,但我想要输出 用我正在使用的基地的第0个字符填充。
例如,如果我使用base 3
int n,v;
char txt[100];
for(n=0;n<5;n++)
{
ToBase(3,n,txt);
FromBase(3,&v,txt);
printf("\n m=%u txt=[%s] i=%u",n,txt,v);
}
输出:
m=0 txt=[A] i=0
m=1 txt=[B] i=1
m=2 txt=[C] i=2
m=3 txt=[BA] i=3
m=4 txt=[BB] i=4
m=5 txt=[BC] i=5
m=6 txt=[CA] i=6
m=7 txt=[CB] i=7
m=8 txt=[CC] i=8
m=9 txt=[BAA] i=9
我需要的输出是:
m=0 txt=[A] i=0
m=1 txt=[B] i=1
m=2 txt=[C] i=2
m=3 txt=[AA] i=3
m=4 txt=[AB] i=4
m=5 txt=[AC] i=5
m=6 txt=[BA] i=6
m=7 txt=[BB] i=7
m=8 txt=[BC] i=8
m=9 txt=[CA] i=9
以下是功能:
void ToBase(int base,int num,void* str)
{
char * tbl="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char buf[66] = {'\0'};
char * out;
int n;
int i,len=0,neg=0;
if(base>26)
oof;
n = ((neg = num < 0)) ? (~num) + 1 : num;
do {
buf[len++] = tbl[n % base];
} while(n /= base);
out=(char*)str;
for (i = neg; len > 0; i++)
out[i] = buf[--len];
}
void FromBase(int base,int* num,void* str)
{
int i,d,n,sl;
char*bp;
bp=(char*)str;
sl=strlen(bp);
i=0;
for(n=0;n<sl;n++)
{
i*=base;
if(bp[n]>='A'&&bp[n]<='Z')
d=(bp[n]-'A');
else if(bp[n]>='a'&&bp[n]<='z')
d=(bp[n]-'a');
i+=d;
}
*num=i;
}
非常感谢任何帮助 -
答案 0 :(得分:0)
您需要添加一项功能,以便知道要输出的字符数。只做一个小小的改变:
void ToBase (int base,int num,void* str,int min_length)
{
char * tbl="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char buf[66] = {'\0'};
char * out;
int n;
int i,len=0,neg=0;
if(base>26) oof; /* is a macro? perhaps use assert() */
n = ((neg = num < 0)) ? (~num) + 1 : num;
do { buf[len++] = tbl[n % base]; } while(n /= base||--min_length>0);
out=(char*)str;
for (i = neg; len > 0; i++) out[i] = buf[--len];
}
答案 1 :(得分:0)
在ToBase
切换:
do { buf[len++] = tbl[n % base]; } while(n /= base);
用这个:
do { buf[len++] = tbl[n % base]; n = (n/base) - 1; } while(n >= 0);