gpt4 book ai didi

c中的转换

转载 作者:太空宇宙 更新时间:2023-11-03 23:26:37 25 4
gpt4 key购买 nike

我是 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);
}

程序运行不起来,谁能赐教?谢谢

最佳答案

程序分析

我首先注意到 a 被声明为 int,但是它被传递给 printf%s 作为格式说明符。 %s 指定关联的参数将是一个字符串,而 a 不是。结果将是未定义的行为,可能导致崩溃

您没有指定 int2char() 的作用,但我们假设它将数字“数字”转换为相应的 char 值。考虑到这一点,让我们假设它的实现类似于:

int int2char(int d) {
return "0123456789abcdefghijklmnopqrstuvwxyz"[d];
}

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

我注意到如果 value 小于 basea 仍然是 0。很可能,即使当 value 小于 base 时,您的意思也可能是为 a 计算一个值。这表明另一个逻辑错误。

基础转换

数dKdK-1 .. d0,其中每个di在(0 .. 9), 是 ∑di×10i 的简写形式。要发现数字 N 的基 10 位,过程是:

di = N / 10i mod 10

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

di = N / Bi mod B

在您的代码中,除以基数的递归调用代表计算的第一部分。但是,在计算 a 时,您遗漏了计算的“mod”部分。

解决方案1

假设基数是从 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);
}

因为您没有将 a 传递到您的递归调用中,所以您只能使用它来存储要打印的当前数字。因此,将代码从 if 检查中存储到 a 中,因为您总是希望在最后打印一个合理的值。 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));
}

关于c中的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25695896/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com