转换c

Rad*_*ius 2 c functional-programming

我是C的新手,我需要在c中编写一个函数,它将整数转换为指定基数中的字符串并打印出来.

如果我的输入值为1234(基数为10),则应返回2322(基数为8).

这是我目前正在处理的代码结构:

void int2ascii(int value, int base){
    int a=0;
    if (value > base) {
         a = a + int2char(value);     //recursive case
         int2ascii(value/base, base); //base case
    }
    printf("%s\n",a);
 }
Run Code Online (Sandbox Code Playgroud)

程序不会运行,有人可以开导我吗?谢谢

jxh*_*jxh 5

分析你的程序

我第一次注意到关闭该a声明int,但它传递到printf%s作为格式说明.%s指定关联的参数将是一个字符串,而a不是.结果将是未定义的行为,并且可能是导致崩溃的原因.

您没有指定是什么int2char(),但我们假设它将数字"数字"转换为相应的char值.考虑到这一点,让我们假设它的实现类似于:

int int2char(int d) {
    return "0123456789abcdefghijklmnopqrstuvwxyz"[d];
}
Run Code Online (Sandbox Code Playgroud)

在您的代码中,您传递valueint2char().在我的假设实现中,这将导致数组的越界访问,从而导致未定义的行为.这表示存在逻辑错误,并且是导致崩溃的另一个可能原因.

我注意到,如果value小于base,a仍然存在0.也许,你真的想要计算一个值,a即使value它小于base.这表示另一个逻辑错误.

基本转换

数d ķ d K-1 .. d 0,其中每个d 是在(0..9),是一种简写形式ΣD ×10 .要发现数字N的基数10位,过程为:

d = N/10 模10

但是,事实证明,你可以用一些其他基数替换10来计算该基数中数字的数字:

d = N/B MOD乙

在您的代码中,由基数除法的递归调用表示计算的第一部分.但是,在计算中a,您错过了计算的"mod"部分.

解决方案1

假设base是2到36,并且你int2char(d)做的事情或多或少如前所述:

void int2ascii(int value, int base){
    int a=0;
    a = a + int2char(value%base);
    if (value > base) {
         int2ascii(value/base, base);
    }
    printf("%c",a);
}
Run Code Online (Sandbox Code Playgroud)

因为您没有a进入递归调用,所以只能使用它来存储要打印的当前数字.因此,移动代码存储在值a出的if支票,因为你总是希望有一个合理的值,在最后打印.数字输入a是基数base,因此您需要模数结果来获得正确的数字值.由于a表示一个字符,更改格式字符串以匹配,并删除\n所有数字最终在同一行.

解决方案2

第一种解决方案是尝试保留大部分原始代码.由于a初始化为0,额外添加不会使其不正确.但是,由于打印直到最后才会发生,因此根本不需要存储该值,并且可以在您实际想要打印它时进行计算.考虑到这一点,该程序可以简化为:

void int2ascii(int value, int base){
    if (value > base) {
         int2ascii(value/base, base);
    }
    printf("%c",int2char(value%base));
}
Run Code Online (Sandbox Code Playgroud)