永发信息网

c语言实现进制转换算法,void convto(char *s,int n,int b)

答案:5  悬赏:50  手机版
解决时间 2021-01-29 21:56
  • 提问者网友:刺鸟
  • 2021-01-29 10:20
c语言实现进制转换算法,void convto(char *s,int n,int b)
最佳答案
  • 五星知识达人网友:风格不统一
  • 2021-01-29 11:59
楼上的 hi_smile_today 似乎只是对语句进行了解释,例如
len是个整数,len=strlen(s),是计算字符串s的实际字符数,
我想这应该不是你最想要的,实际上len是一个很关键的变量,是指
转换后新的数据的某位,如十进制个、十、百、千位等;

从字面上看,len应该是length,所以我一开始也没有看明白,
因为这个名字命名的实在是距离具体意义太远了。

而且这个函数写得并不好(还有BUG),虽然算法挺不错;正所谓人靠衣装马靠鞍,
函数 void convto(char *s,int n,int b)一眼望去根本不知道要表达什么,
尤其这种单字符变量 s n b ,它们不会比臭名昭著的goto好到哪里去,每每收到这样
的代码,真是疾首痛心;

言归正传,参数s,是一个外部缓冲区,可以看成是 char s[],也就是说s的存储空间
是由外部传入的,所以程序有必要对s的有效性(空指针)进行检查,甚至是必须的,
而该程序没有,指针很强大,但很危险!更加危险的是,s缓冲区没有大小指示,那么
如果一个很大的数要求转换为2进制,可以想象,函数栈崩溃或者程序崩溃是必然的!
如果你觉得这是小事,那么 strncpy 岂不是浪费,另外 strcpy 在新的VS环境下是会被
警告的,编译器会请求你使用 strncpy 来代替,可见微软是多么重视这件“小事”。

既然有参数有效性检查,那就不免可能检查失败,因此函数或许可以一种返回值来告知
调用者函数的执行情况,但该函数却是 void;
所以函数大概型如:
int convert2(char dst[], int size, int numToConv, int numeration)

这样,dst 为destination目标缓冲区,size 为缓存容量,numToConv 要转换的数,numeration
为要转换到的进制(或计数法),程序的可读性是非常重要的;
数组和指针虽然有很大区别,但是在C中作为参数时,是几乎没有区别的,这里写成 char dst[]
和 char *dst,是一个意思,但前者能提醒程序员,这是个外部存储,要求调用者为其分配存储,
即可以指示出该变量的存储由谁负责分配;

递归函数的重要因素之一是 “终止条件”,对于本函数就是
f(n==0)
{
strcpy(s,"");
return ;
}
正在递归运行的所有函数将在这里发生第一次返回;
由于倒数第一次递归的函数遇到了终止条件而发生了返回,所以便返回到了倒数第二次的递归函数里,
因为倒数第二次递归函数是倒数第一次的调用者;

然后运行 len=strlen(s); 这也是该语句的第一次执行,可以想象此时,len应该是新的数据的
最高位,故应当写在字符串s的最左边,根据后面的写语句 s[len] = ...,可以断定,
len此次(第一次)必须为0,这样s[0]才会写入到数据的最高位;
由于strcpy(s,""); 刚刚被执行过,所以len=strlen(s), 肯定是0,所以strcpy(s,""); 意义就是
保证对数据最高位的成功写入。

可见,下一次,len=strlen(s) 将会是 1(次高位),下下次将会是 2 , ...... n(最低位);

随着递归的依次返回,数据也从最高位到最低位被依次写入;

程序的BUG:

根据语句 convto(s,n/b,b); 知当n被运算到0是,产生了递归的终止条件,但是,如果我就是想
对0进行转换呢,得出的结果应该是 s = {‘0’, '\0'}
而程序得出的却是 s = {'\0'}
全部回答
  • 1楼网友:逃夭
  • 2021-01-29 16:54
能把调用的代码附上吗?并且说明需要达到的效果。
  • 2楼网友:几近狂妄
  • 2021-01-29 15:18
 void convto(char *s,int n,int b){
char bit[]={"0123456789ABCDEF"};
int len;//这行是什么意思:整型:字符长度
if(n==0){
strcpy(s,"");//这行是什么意思:将""中的字符串复制给s,因为""为空字符串,所以清零
return ;}
convto(s,n/b,b);
len=strlen(s);//这行是什么意思  s没有改变长度呀;strenlen(s)是计算s字符串的长度
s[len]=bit[n%b];
s[len+1]='';
}
//递归怎么理解:函数自己调用自己
  • 3楼网友:梦中风几里
  • 2021-01-29 14:25
int len;//声明了一个整型的变量,意思是len的取值只能是整数,其他的会出错
strcpy(s,"");//由函数的输入值char *s可知,s是字符型的指针,这句话的意识是用空字符串代替s
再说递归的意思。递归是一种算法,比较难,有两个基本要素,1是递归的程序必须有程序停止的时候,2是递归一次,问题规模越来越小
其他的你自己一步一步算,递归就要自己去模拟程序运行的步骤
  • 4楼网友:笑迎怀羞
  • 2021-01-29 13:15
void convto(char *s,int n,int b)
{
    char bit[]={"0123456789ABCDEF"}
    int len;    // 定义整形变量len(长度),且不赋初值
    if(n==0)
    {
        strcpy(s,"");    // 清空s,实际相当于s[0]='',即使s为空字符串,因为n=0,表示已经转换完成,
        return ;
    }
    convto(s,n/b,b);
    len=strlen(s);        // 计算字符串s的实际字符数
    s[len]=bit[n%b];
    s[len+1]='';
}


递归就是再去调用本身这个同名函数与调用其它函数没什么不同,重点是退出递归的条件,比如在后续必须有代码能让n==0。


你这个问没有把明确需求提出,函数功能很难理解
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯