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
相关产品推荐
相关产品推荐

