C 修改基数转换

C 修改基数转换,c,string,algorithm,C,String,Algorithm,我有一个精神障碍,试图做一个修改 数字基转换器 我所拥有的工作正常,但是我想要输出 用我正在使用的基础的第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 t

我有一个精神障碍,试图做一个修改 数字基转换器

我所拥有的工作正常,但是我想要输出 用我正在使用的基础的第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=[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;
}
void-ToBase(int-base,int-num,void*str)
{
char*tbl=“abcdefghijklmnopqrstuvxyz”;
char buf[66]={'\0'};
字符*输出;
int n;
int i,len=0,neg=0;
如果(基数>26)
oof;
n=((neg=num<0))?(~num)+1:num;
做{
buf[len++]=tbl[n%碱基];
}而(n/=基);
out=(char*)str;
对于(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;

对于(n=0;n='A'&&bp[n]='A'&&bp[n],您需要添加一个功能,以便它知道要输出多少个字符。只需做一个最小的更改:

     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];
      }
void-ToBase(int-base,int-num,void*str,int-minu-length)
{
char*tbl=“abcdefghijklmnopqrstuvxyz”;
char buf[66]={'\0'};
字符*输出;
int n;
int i,len=0,neg=0;
如果(base>26)oof;/*是宏,那么可以使用assert()*/
n=((neg=num<0))?(~num)+1:num;
do{buf[len++]=tbl[n%base];}而(n/=base | |--min_长度>0);
out=(char*)str;
对于(i=neg;len>0;i++)out[i]=buf[--len];
}

中切换此开关:

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

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

请修正缩进。请概述“基数计算器”的确切含义。将一个数字基数转换为另一个数字基数-如果调用ToBase时第一个arg为16,则输出十六进制,如果arg为2,则输出二进制等-显然,
ToBase
frombobase
(或两者都有)存在问题因为你的
txt
的计算值不是你想要的。同样明显的是,除非你向我们展示
ToBase
FromBase
中发生的事情,否则没有人能帮到你。也许不那么明显:你的帖子毫无意义。你说你计算正确,问题是填充,但你没有没有填充,输出似乎是错误的。Protip:base小于10只能用数字来写,
0
始终可以表示零。此函数-用于域爬虫-(仅限字母)-我想将域名转换为数字,例如a.com z.com aa.com az.com ba.com等:)yes oof;是我的宏,它调用MessageBox();@AshodApakian通常我们编写
assert(base>26)
。您可以
#undef assert
#define assert(x)do{if(x)oof;}while(0)
如果您想迁移到一个更具可移植性的编码实践中…oof-实际上调用了一大堆分析宏,这些宏在这个时间点上还远没有交织在一起-整个文件的当前长度只有55k行-很抱歉有点奇怪snippet@AshodApakian实际上,做出这样的改变还有更多的理由……
assert
是其中的一部分大多数IDE和构建系统告诉您是在调试模式还是发布模式下构建的机制。如果您使用
#ifndef NDEBUG
控制
oof
,那么您可以从最终产品中剥离这些评测内容。只要不改变程序的功能,
oof
有多复杂并不重要。
do { buf[len++] = tbl[n % base]; n = (n/base) - 1; } while(n >= 0);