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

C语言实现整数前半部分反转功能的程序错误修正咨询

修复反转整数前半部分的C程序问题

让我来帮你搞定这个问题——你的代码现在输出不符合预期,主要是几个逻辑和存储上的小问题,我来一步步帮你修正:

原代码的核心问题

  1. 数组大小不足:char arr[sizeof(n)]这里,sizeof(n)是int类型的字节数(通常是4),但像65741这种5位数字,数组就会越界,导致未定义行为,结果自然不对。
  2. 数字存储顺序颠倒:你用arr[i++] = n % 10把数字的最后一位存在数组第一个位置,比如65741会被拆成1、4、7、5、6存在数组里,这和正常数字顺序完全相反,后续处理逻辑就跟着错了。
  3. 反转逻辑搞反了:你现在的代码是先拼接数字的后半段,再拼接前半段的逆序,但我们需要的是反转前半段,后半段保持原样。

修正后的简洁版本(用字符串处理)

用字符串处理会更直观,避免手动计算位数和内存管理的麻烦,代码如下:

#include <stdio.h>
#include <string.h>

int ReverseFirstHalf(int n) {
    char numStr[20]; // 足够存下int范围内的所有数字
    // 把整数转成字符串
    sprintf(numStr, "%d", n);
    int totalDigits = strlen(numStr);
    int halfLength = totalDigits / 2;

    // 反转字符串的前半部分
    for (int i = 0; i < halfLength / 2; i++) {
        char temp = numStr[i];
        numStr[i] = numStr[halfLength - 1 - i];
        numStr[halfLength - 1 - i] = temp;
    }

    // 把处理后的字符串转回整数
    int result = atoi(numStr);
    printf("After Reversing first half= %d\n", result);
    return result;
}

int main() {
    int n;
    printf("Enter the value of n: ");
    scanf("%d",&n);
    ReverseFirstHalf(n);
    return 0;
}

测试验证

  • 输入3545:字符串是"3545",前半部分是"35",反转后变成"53",最终字符串是"5345",输出5345,符合预期。
  • 输入65741:字符串是"65741",前半部分是"65",反转后变成"56",最终字符串是"56741",输出56741,完美符合要求。

如果你想用数组处理(手动实现)

如果不想用字符串,也可以用动态数组来存储每一位数字,逻辑更清晰:

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

int ReverseFirstHalf(int n) {
    if (n == 0) {
        printf("After Reversing first half= 0\n");
        return 0;
    }

    int temp = n;
    int digitCount = 0;
    // 先计算数字的总位数
    while (temp != 0) {
        digitCount++;
        temp /= 10;
    }

    // 分配足够大的数组存储每一位(按正常顺序)
    int* digits = (int*)malloc(digitCount * sizeof(int));
    if (digits == NULL) {
        printf("Memory allocation failed\n");
        return -1;
    }

    temp = n;
    // 从高位到低位存储数字的每一位
    for (int i = digitCount - 1; i >= 0; i--) {
        digits[i] = temp % 10;
        temp /= 10;
    }

    int halfLen = digitCount / 2;
    // 反转前半部分的数字
    for (int i = 0; i < halfLen / 2; i++) {
        int swapTemp = digits[i];
        digits[i] = digits[halfLen - 1 - i];
        digits[halfLen - 1 - i] = swapTemp;
    }

    // 把数组转回整数
    int result = 0;
    for (int i = 0; i < digitCount; i++) {
        result = result * 10 + digits[i];
    }

    printf("After Reversing first half= %d\n", result);
    free(digits); // 释放动态分配的内存
    return result;
}

int main() {
    int n;
    printf("Enter the value of n: ");
    scanf("%d",&n);
    ReverseFirstHalf(n);
    return 0;
}

这个版本手动处理了数字的每一位,适合理解底层逻辑,测试效果和字符串版本一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 22:42:45