C语言实现整数前半部分反转功能的程序错误修正咨询
修复反转整数前半部分的C程序问题
让我来帮你搞定这个问题——你的代码现在输出不符合预期,主要是几个逻辑和存储上的小问题,我来一步步帮你修正:
原代码的核心问题
- 数组大小不足:
char arr[sizeof(n)]这里,sizeof(n)是int类型的字节数(通常是4),但像65741这种5位数字,数组就会越界,导致未定义行为,结果自然不对。 - 数字存储顺序颠倒:你用
arr[i++] = n % 10把数字的最后一位存在数组第一个位置,比如65741会被拆成1、4、7、5、6存在数组里,这和正常数字顺序完全相反,后续处理逻辑就跟着错了。 - 反转逻辑搞反了:你现在的代码是先拼接数字的后半段,再拼接前半段的逆序,但我们需要的是反转前半段,后半段保持原样。
修正后的简洁版本(用字符串处理)
用字符串处理会更直观,避免手动计算位数和内存管理的麻烦,代码如下:
#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
相关产品推荐
相关产品推荐

