#include <iostream>
using namespace std;
void myfunction(int array[], int array1[], int array2[], int, int, int);
int main()
{
int array[5], array1[5], array2[5];
cout << "Enter array:";
for (int i = 0; i < 5; i++)
{
cin >> array[i];
cin >> array1[i];
}
myfunction(array, array1, array2, 5, 5, 5);
for (int i = 0; i < 5; i++)
cout << array2[i];
}
void myfunction(int array[], int array1[], int array2[], int n, int m, int o)
{
int k = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
{
if (array[i] == array1[j])
array2[k] = array1[j];
k++;
}
for (int i = k + 1; i < o; i++)
array2[i] = 0;
}
这是我想到的逻辑。但它给出了我不知道的分段错误。而且,我不知道我错在哪里。请指导我
答案 0 :(得分:1)
我相信你有一个主要问题:
if(array[i]==array1[j])
array2[k]=array1[j];
k++;
每次执行k++
部分,但只有在找到匹配项时,才应每array
次迭代执行一次。这是给你seg故障的部分。
您可以像这样修复整个嵌套:
for (int i = 0; i < n; ++i, ++k)
{
const auto val = array[i];
if (std::any_of(array1, array1+n, [&val](int v){return v == val;}))
array2[k] = array[i];
else
array2[k] = 0;
}
考虑到你不使用c++11
,你可以写上面的等价物:
for (int i = 0; i < n; ++i, ++k)
{
bool match = false;
for (int j = 0; j < m; ++j)
{
if (array[i] == array1[j])
{
match = true;
break;
}
}
if (match)
array2[k] = array[i];
else
array2[k] = 0;
}
这样你也可以跳过以下循环,这也有一个问题:
for (int i = k + 1; i < o; i++)
对于{1, 2, 3, 3, 5}
和{1, 2, 4, 4, 5}
等输入数据的结果,您应该得到{1, 2, 0, 0, 5}
根据您的评论是预期输出。
一般情况下,我建议您使用std::vector
或std::array
,因为您使用的是const大小的数组。这样,您就不必将数组大小作为硬编码值传递到此处。此外,您将能够使用类似foreach的循环,代码将变得更清晰。
答案 1 :(得分:0)
您的问题出在以下for
循环中: -
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
{
if(array[i]==array1[j])
array2[k]=array1[j];
k++;//this is being incremented each iteration
}
for(int i=k+1; i<o; i++)//What are you doing here I = 5 + 1 = 6
array2[i]=0;// what will happened here it will not execute
如下所示纠正: -
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
{
if(array[i]==array1[j])
{
array2[k]=array1[j];
k++;
}
}