printf应该已经打印后更改其值

Mic*_*ael 3 c printf

所以我在这里有这个代码,(现在)只需将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);
}
Run Code Online (Sandbox Code Playgroud)

并且这会计算正确的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);
Run Code Online (Sandbox Code Playgroud)

如果添加了上面的代码,它会完全更改第一个printf的结果,使其返回:

The number 100(base2) in base 10 is: 4196784.
The number 100(base2) is: 0
Run Code Online (Sandbox Code Playgroud)

我不能为我的生活弄清楚为什么会这样.我猜它与某些指针有关,但我还没有真正使用过,我不知道为什么添加一个看似自变量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;
} 
Run Code Online (Sandbox Code Playgroud)

编辑:这是我使用的唯一其他功能,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;
}
Run Code Online (Sandbox Code Playgroud)

这是我调用函数的地方:

int main() {
    printf("Hello World\n");
    base1_base2(2, 5, 100);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Ere*_*ith 7

只是写得:

int num = 0, place = 0;
Run Code Online (Sandbox Code Playgroud)

你一定会完成的.

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

  • 因为在执行它时更改输出二进制会导致内存中位置的变化,所以你的运气少了,因为`num`是随机零的. (4认同)