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

C++数组旋转k步问题:k<2时输出异常,求错误定位

数组旋转代码的错误分析与修正

核心错误

代码中第二个循环的终止条件错误,导致元素复制不完整或出现未初始化的垃圾值,最终输出异常。

错误细节分析

原代码第二个循环的条件为:

for(int i=0;i<=k;i++)

这个条件会引发以下问题:

  • 当k=2、n=6时,循环仅遍历i=0,1,2,只复制原数组前3个元素,但实际需要复制n-k=4个元素(原数组索引0到3),导致ansarr[5]未被赋值,输出时打印内存垃圾值。
  • 当k=0时,k%n=0,第一个循环不执行,第二个循环仅复制i=0一个元素,剩余n-1个位置都是未初始化值,输出完全异常。
  • 当k=1时,循环复制i=0,1两个元素,但实际需要复制n-k=5个元素,同样导致部分位置未赋值。

修正方案

将第二个循环的终止条件改为i < n - k——旋转后,原数组前n-k个元素需要放到结果数组的后半部分,总数量恰好是n-k个:

for(int i=0;i < n - k;i++){
    ansarr[j++]=arr[i];
}

修正后的完整代码

#include<iostream>
using namespace std;

void inputarray(int arr[],int size){
    for(int i=0;i<size;i++){
        cin>>arr[i];
    }
}

int main(){
    int n;
    cin>>n;
    int arr[100];

    inputarray(arr,n);

    // 注意:C++标准不支持变长数组,建议改用vector<int> ansarr(n);
    int ansarr[n];

    int k;
    cin>>k;

    k = k%n;
    int j=0;

    for(int i =n-k;i<n;i++){
        ansarr[j++] = arr[i];
    }
    // 修正后的循环条件
    for(int i=0;i < n - k;i++){
        ansarr[j++]=arr[i];
    }
    for(int i=0;i<n;i++){
        cout<<ansarr[i];
    }
}

额外提示

int ansarr[n]属于C99变长数组特性,并非标准C++语法,部分编译器可能无法编译。更规范的写法是使用std::vector:

#include<vector>
// ...
vector<int> ansarr(n);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 23:37:45