3

所以我在这里有这个代码,它(现在)只是把一个base1数字变成一个base 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;
}
4

2 回答 2

7

只要注意写:

int num = 0, place = 0;

你一定会完成的。

这就是为什么我建议逐行声明一个变量。

于 2012-10-09T08:21:04.613 回答
2

作为你,我不明白这里发生了什么。

如果这是 1990 年,我会说您使用 32 位整数值并printf()期望 16 位整数,但在这种情况下这是不正确的:如果存在宽度不匹配,那么所有其他数字也将是错误的。所以它会打印

The number 0(base100)

或者

The number 100(base0)

取决于您平台的字节序。

由于问题不在您的代码中,因此它必须在其他地方。建议:

  1. 尝试摆脱num_digits(). 请参阅下面的评论。

  2. 添加更多printf()s 以查看所有值如何变化

  3. 在调试器中运行代码

  4. 关闭编译器的所有优化标志。也许其中一个触发器是一个错误。

  5. 启用编译器支持的所有警告标志。

一些评论:

  1. num_digits(number)是一个相当昂贵的功能;不要循环调用它(即N次)。而是将结果缓存在局部变量中。或者只是在为 0 时停止rem(即用 替换for循环while(0 != rem))。

  2. 名字base1不好。改为使用inputBase,因为这传达了意图。

  3. 没有必要使用floor(); 整数除法总是向下取整。

于 2012-10-09T08:17:50.667 回答