0

変更された基数コンバーターを作成しようとして精神的ブロックが発生しています。

私が持っているものは正しく動作しますが、使用しているベースの 0 番目の文字で出力をパディングしたいと考えています。

たとえば、ベース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;
}

どんな助けでも大歓迎です-

4

2 に答える 2

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];
      }
于 2013-01-31T01:02:48.477 に答える
0

これToBaseを切り替える:

do { buf[len++] = tbl[n % base]; } while(n /= base);

これとともに:

do { buf[len++] = tbl[n % base]; n = (n/base) - 1; } while(n >= 0);
于 2013-01-31T01:18:52.447 に答える