You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

处理5位以内正整数程序中,函数指针无法接收动态指针参数的问题

问题分析与解决

你的代码里不是malloc动态分配的指针传递失败,核心问题是outputDigit函数在统计位数时直接修改了*number的原始值——把它循环除以10直到变成0,导致后续outputNumber和outputReverseNumber拿到的数值是0,自然无法正确输出各位数字。

另外代码还有两处逻辑错误:

  • 输入判断里,你限制了*number >9999,但题目要求是不超过5位正整数,5位最大是99999,这里条件写错了。
  • outputNumber里的base计算逻辑有bug,当数字是1位时,base会是10,导致输出0。

修正后的代码

#include <stdio.h>
#include <stdlib.h>

void inputNumber(int *number){
    printf("Enter number: ");
    scanf_s("%d", number);
    while(*number <= 0 || *number > 99999){ // 修正5位数字的上限
        if(*number <= 0){
            printf("The number is not positive integer! Retry!\nEnter number: ");
        }
        if(*number > 99999){
            printf("The number is more than 5 digits! Retry!\nEnter number: ");
        }
        scanf_s("%d", number);
    }
}

void outputDigit(int *number, int *digit){
    int temp = *number; // 用临时变量计算,不修改原数值
    int i;
    for(i = 0; temp != 0; i++){
        temp /= 10;
    }
    *digit = i;
    printf("The number is %d digits!\n", i);
}

void outputNumber(int *number, int *digit){
    int base = 1;
    int temp = *number;
    // 修正base计算:得到10^(digit-1)
    for(int i = 1; i < *digit; i++){
        base *= 10;
    }
    for(int i = 0; i < *digit; i++){
        printf("%d ", temp / base);
        temp -= temp / base * base;
        base /= 10;
    }
    printf("\n");
}

void outputReverseNumber(int *number, int *digit){
    int temp = *number;
    for(int i = 0; i < *digit; i++){
        printf("%d ", temp % 10);
        temp = (temp - temp % 10) / 10;
    }
    printf("\n");
}

void function(int *number, int *digit, void (*fun[])(int*, int*)){
    for(int i = 0; i < 3; i++){
        fun[i](number, digit);
    }
}

int main(){
    int *number = (int*)malloc(sizeof(int));
    int *digit = (int*)malloc(sizeof(int));
    void (*fun[3])(int*, int*) = {outputDigit, outputNumber, outputReverseNumber};
    inputNumber(number);
    function(number, digit, fun);
    free(number);
    free(digit);
    system("pause");
    return 0;
}

关键修改点

  1. 保护原始数值:在outputDigit中使用临时变量temp代替*number进行位数计算,避免破坏原输入值。
  2. 修正输入上限:把*number >9999改成*number >99999,符合5位数字的要求。
  3. 修复base计算逻辑:将base初始化为1,循环digit-1次乘以10,确保不同位数的数字都能正确计算最高位的除数。

现在你的代码可以正常通过函数指针调用各个功能,malloc分配的指针也能正确传递参数了。

内容的提问来源于stack exchange,提问作者Navy Zhang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 02:15:59