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

C++实现数组负数移至末尾出现垃圾值该如何解决

数组负数移动到末尾代码问题修复方案

问题根因

你代码存在两个核心错误:

  • 数组越界访问:while循环判断条件写为j <= n,而数组下标合法范围是0 ~ n-1,当j = n时访问arr[j]会读取到数组外的未初始化脏数据,也就是你输出里的垃圾值来源。
  • 双指针逻辑缺陷:交换负数和正数的分支中仅对i执行自增,未同步移动j指针,且未处理元素为0的边界场景。另外你读取数组的for循环重复定义了i变量,虽然不直接触发故障,但属于不规范写法,容易引发逻辑混淆。

修复后代码

#include <iostream>
using namespace std;
#define MAX 10
int main()
{
    int n, i = 0, arr[MAX];
    cin >> n;
    // 去掉重复定义的i,直接用外层变量
    for(i = 0; i < n; i++)
    {
        cin >> arr[i];
    }
    int j = 1;
    // 修正循环条件,j最大为n-1
    while(i < n && j < n)
    {
        if(arr[i] >= 0)
        {   
            i++;
            // 保证j始终在i后方,避免无效遍历
            if(j <= i) j = i + 1;
        }
        else if(arr[i] < 0 && arr[j] >= 0)
        {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
            i++;
            j++;
        }
        else if(arr[i] < 0 && arr[j] < 0)
        {
            j++;
        }
    }
    for(i = 0; i < n; i++)
    {
        cout << arr[i] << " ";
    }
    return 0;
}

验证结果

针对你给出的输入用例:

4
-8
-6
7
8

修复后输出为:

7 8 -8 -6 

符合将所有负数移动到数组末尾的需求,正数的相对顺序保持不变。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:48:05