所以我在这里有这个代码,(现在)只需将base1号码转换为基数为10的数字
/**
* This function is supposed to convert 'number' from base1 to a number in base2.
* It isn't fully implemented yet, and I've only converted base1 to a base 10 number.
*/
void base1_base2(int base1, int base2, int number) {
int num, place = 0;
int rem = number;
int i;
for (i = 0; i < num_digits(number); i++) {
int mod = rem % 10;
rem = floor(rem / 10);
int powerResult = pow(base1, place++);
num = num + mod * powerResult;
}
int base10_num = num;
printf("The number %i(base%i) in base 10 is: %i\n", number, base1, base10_num);
}
然后计算正确的base10数,即函数调用 base1_convert(2,5,100)将按预期返回4:
The number 100(base2) in base 10 is: 4
当我将此代码直接添加到该函数中的最后一个printf下面时,会出现问题:
int base2_num = 0;
printf("The number %i(base%i) is: %d\n", number, base1, base2_num);
如果添加了上面的代码,它会完全改变第一个printf的结果,使其返回:
The number 100(base2) in base 10 is: 4196784.
The number 100(base2) is: 0
我不能为我的生活弄清楚为什么会这样。我猜它与某些指针有关,但我还没有真正使用过,我不知道为什么添加一个看似独立的变量int base2_num = 0;
会改变所有这些。
以上是添加上述行后的完整修改代码。
void base1_base2(int base1, int base2, int number) {
int num, place = 0;
int rem = number;
int i;
for (i = 0; i < num_digits(number); i++) {
int mod = rem % 10;
rem = floor(rem / 10);
int powerResult = pow(base1, place++);
num = num + mod * powerResult;
}
int base10_num = num;
printf("The number %i(base%i) in base 10 is: %i\n", number, base1, base10_num);
int base2_num = 0;
printf("The number %i(base%i) is: %d\n", number, base1, base2_num);
return;
}
编辑:这是我使用的唯一其他功能,num_digits。它返回整数中的位数。
int num_digits(int integer) {
char int_string[100];
int str_length;
sprintf(int_string, "%i", integer);
str_length = strlen(int_string);
return str_length;
}
这就是我调用函数的地方:
int main() {
printf("Hello World\n");
base1_base2(2, 5, 100);
return 0;
}
答案 0 :(得分:7)
注意写:
int num = 0, place = 0;
你一定会完成的。
这就是为什么我建议逐行声明一个变量。
答案 1 :(得分:2)
和你一样,我不知道这里发生了什么。
如果这是1990年,我会说你使用32位int值而printf()
期望16位整数但在这种情况下不可能是真的:如果有宽度不匹配,那么所有其他数字也是错的。所以它会打印
The number 0(base100)
或
The number 100(base0)
取决于您平台的结束。
由于问题不在您的代码中,因此必须在其他地方。建议:
尝试摆脱num_digits()
。请参阅以下评论。
添加更多printf()
以查看所有值的更改
在调试器中运行代码
关闭编译器的所有优化标志。也许其中一个触发器就是一个错误。
启用编译器支持的所有警告标志。
一些意见:
num_digits(number)
是一个相当昂贵的功能;不要在循环中调用它(即N次)。将结果缓存在局部变量中。或者只是在rem
为0时停止(即将for
循环替换为while(0 != rem)
)。
名称base1
不好。请改用inputBase
,因为它传达了意图。
无需使用floor()
;整数除法总是向下舍入。