我有一个C ++程序,其中我必须根据要旋转的给定元素数(x)顺时针旋转数组例如,如果输入数组是[1,2,3,4,5],因为必须旋转2个元素(表示为x)。输出数组应该是[3,4,5,1,2]。
#include <iostream>
#include<algorithm>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--){
int n,x;
cin>>n>>x;
int a[n],b[x];
for(int i=0;i<n;i++){
cin>>a[i];
}
copy(a,a+x,b);
copy(b,b+x,a+n);
n=n+x;
for(int i=x;i<n;i++){
cout<<a[i]<<" ";
}
}
return 0;
}
我在这里所做的是,我将给定数量的元素复制到一个新的数组中。之后将它们从'n'开始复制回到原始数组中。所以我的数组看起来像[1,2,3,4,5 ,1,2]。后来我从索引'x'开始打印数组。这样我的数组看起来像[3,4,5,1,2]。我可以通过编译程序获取输出。但是,当在名为GeekforGeeks的网站中提交代码时,其编译器抛出了Segmentation Fault(SIGSEGV)。
任何人都可以帮我吗?
此
int a[n],b[x];
不是标准的c ++。有关详细信息,请参见此处:Why aren't variable-length arrays part of the C++ standard?。将std::vector
用于动态数组。
然后在这里:
copy(a,a+x,b);
您使用x
,但是用于a
的尺寸是n
而不是x
。根据您的输入,这可能会超出阵列的边界。
数组必须具有确定的大小一些编译器接受您的代码,而另一些则不接受因此,请尝试使用指针代替
[使用您给a = {1,2,3,4,5}
,n = 5
和x = 2
的示例来看看您在细节上写的内容。
第一个语句是copy(a,a+2,b);
,即将a
的前两个元素复制到b
的开头,所以我们有
b={1,2,?,?,?}
问号表示b
中的此时未知。请注意,尽管还没有崩溃,但我们错了。 1和2尚未旋转
第二条语句是copy(b,b+2,a+5);
,即,将b的前两个元素复制到从第五个元素开始的a
。现在a
的大小为5,因此它将复制到不存在的元素,因此会崩溃。
您显然还不了解copy
的工作原理。