C语言移除数组指定索引元素后重排 空元素置尾算法实现
代码补全方案
你已经完成了待删除位置的元素置零,内层for循环只需要实现「后续有效元素依次前移、末尾空位清零」的逻辑即可,补全后完整的匹配分支代码如下:
if ((strcmp(temp_string_for_prname, INVENTORY_NAMES_ARRAY[i])) == 0) { // 原有置零逻辑 memset(INVENTORY_NAMES_ARRAY[i], 0, sizeof(INVENTORY_NAMES_ARRAY[i])); INVENTORY_PRICES_ARRAY[i] = 0; INVENTORY_AMOUNT_ARRAY[i] = 0; int j = i; // 补全的重排循环:从删除位置开始,把后面所有有效元素往前挪一位 for (; strlen(INVENTORY_NAMES_ARRAY[j+1]) != 0; j++) { INVENTORY_AMOUNT_ARRAY[j] = INVENTORY_AMOUNT_ARRAY[j+1]; INVENTORY_PRICES_ARRAY[j] = INVENTORY_PRICES_ARRAY[j+1]; // 用memmove处理字符串拷贝,避免内存重叠问题 memmove(INVENTORY_NAMES_ARRAY[j], INVENTORY_NAMES_ARRAY[j+1], sizeof(INVENTORY_NAMES_ARRAY[j])); } // 把移动后末尾遗留的旧数据清零 memset(INVENTORY_NAMES_ARRAY[j], 0, sizeof(INVENTORY_NAMES_ARRAY[j])); INVENTORY_AMOUNT_ARRAY[j] = 0; INVENTORY_PRICES_ARRAY[j] = 0; // 删除完成后直接跳出循环,避免前移后的元素被重复匹配 break; }
逻辑说明
- 循环终止条件判断
j+1位置的名称是否为空:原数组本身就是「有效元素连续在前、空元素全在末尾」的结构,遇到第一个空名称就说明已经走到有效元素边界,不需要再往后遍历。 - 三个数组同步前移,保证同一个索引下的商品名称、价格、库存对应关系不混乱。
- 移动字符串用
memmove而不是strcpy:相邻数组元素的内存空间连续,memmove可以安全处理内存重叠的拷贝场景。 - 最后必须把j位置(也就是原来最后一个有效元素的位置)的旧数据清零,不然会出现最后一条商品重复的问题。
- 分支末尾加
break:元素前移之后,原来i+1位置的元素会移到i位置,如果不跳出循环,后续遍历会重复处理这个元素。 - 记得提前包含
<string.h>头文件,memmove、memset、strlen、strcmp这些函数都在这个头文件里声明。
内容的提问来源于stack exchange,提问作者Димитър Милчев
相关产品推荐
相关产品推荐

