C语言实现数组零替换为右侧最小奇数的代码问题排查
问题描述
编写一个函数处理给定的非负整数数组,将数组中每个零值替换为该零右侧的最小奇数值;若零右侧无奇数则保留零值不变。
现有代码错误排查
- 传参错误:调用
lowestOdd和printArray时传入的是myarr[20],这是数组下标为20的单个int元素(本身已经数组越界),不是数组首地址,直接传数组名myarr即可,这也是触发warning: passing argument 1 of 'lowestOdd' makes pointer from integer without a cast [-Wint-conversion]警告的直接原因。 - 逻辑错误:
lowestOdd函数原有遍历逻辑不符合需求,没有针对每个零值单独查找其右侧的最小奇数,试图用单个temp变量存储全局最小值,逻辑方向完全错误。 - 语法错误:判断零值的语句写为
if (num[i] = 0),这是赋值操作而非相等判断,正确写法为==;printf中的换行符错写为/n,正确转义字符为\n。 - 边界问题:原遍历逻辑访问
num[i+1]时没有判断i是否到达数组末尾,会触发越界访问;temp变量未初始化,遇到零右侧无奇数的场景会出现未定义行为。 - 认知误区:该功能不需要显式编写复杂指针操作,C语言中数组传参本身会隐式退化为首元素指针,直接通过数组下标访问就可以修改原数组内容。
正确实现代码
#include <stdio.h> void lowestOdd(int num[], int size) { int i, j; for (i = 0; i < size; i++) { // 仅处理值为0的元素 if (num[i] == 0) { int min_odd = -1; // -1标记右侧未找到奇数,适配非负数组的取值范围 // 遍历当前零右侧的所有元素 for (j = i + 1; j < size; j++) { if (num[j] % 2 != 0) { // 首次遇到奇数、或当前奇数比已记录的最小值更小则更新 if (min_odd == -1 || num[j] < min_odd) { min_odd = num[j]; } } } // 找到最小奇数则替换,否则保留原零值 if (min_odd != -1) { num[i] = min_odd; } } } } void printArray(int array[], int size) { int i; for (i = 0; i < size; i++) { printf("%d\n", array[i]); } } int main() { int i, size; int myarr[20]; printf("What is the size of your array? \n"); scanf("%d", &size); // 增加输入合法性校验,避免数组越界 if (size < 1 || size > 20) { printf("Invalid array size!\n"); return 1; } for (i = 0; i < size; i++) { scanf("%d", &myarr[i]); } lowestOdd(myarr, size); printArray(myarr, size); return 0; }
实现说明
- 采用双重遍历逻辑:外层循环遍历数组定位所有零值,内层循环遍历每个零值的右侧区间查找最小奇数,时间复杂度为O(n²),适配题目给定的最大数组长度20的场景,性能完全足够。
- 利用题目给定的「非负整数数组」条件,用
min_odd = -1作为未找到奇数的标记,避免了未初始化变量的问题。 - 数组传参直接传入数组名即可,函数内对数组元素的修改会直接作用于原数组,不需要额外手动定义指针变量。
内容的提问来源于stack exchange,提问作者emcosokic
相关产品推荐
相关产品推荐

