使用函数从C ++中删除数组中的重复项

时间:2013-12-10 18:04:24

标签: c++ arrays function segmentation-fault

我正在编写一个程序,它将一个用户输入整数放入一个数组中,调用一个从该数组中删除重复项的函数,然后输出修改后的数组。当我运行它时,它允许我将值输入到数组中,但是当我输入值时,会给我一个“分段错误”错误消息。我做错了什么?

这是我的代码:

#include <iostream>

using namespace std;

void rmDup(int array[], int& size)
{
        for (int i = 0; i < size; i++)
        {
            for (int j = i + 1; j < size; j++)
            {
                if (array[i] == array[j])
                {
                    array[i - 1 ] = array[i];
                    size--;
                }
            }
        }
}
int main()
{
    const int CAPACITY = 100;
    int values[CAPACITY], currentSize = 0, input;

    cout << "Please enter a series of up to 100 integers. Press 'q' to quit. ";

    while (cin >> input)
    {
       if (currentSize < CAPACITY)   
       {
           values[currentSize] = input;
           currentSize++;
       }
    }

    rmDup(values, currentSize);

    for (int k = 0; k < currentSize; k++)
    {
            cout << values[k];
    }

    return 0;
}

谢谢。

4 个答案:

答案 0 :(得分:3)

for (int i = 0; i < size; i++)
{
    for (int j = i + 1; j < size; j++)
    {
        if (array[i] == array[j])
        {
            array[i - 1 ] = array[i]; /* WRONG! array[-1] = something */
            size--;
        }
    }
}

如果array[0]array[1]相等,array[0-1] = array[0],则表示array[-1] = array[0]。您不应该访问array[-1]

答案 1 :(得分:1)

我甚至无法创建重复项:

int main()
{
    const int CAPACITY = 100;

    cout << "Please enter a series of up to 100 integers. Press 'q' to quit. ";

    std::set<int> myInts;
    int input;
    while (std::cin >> input && input != 'q' && myInts.size() <= CAPACITY) //note: 113 stops the loop, too!
       myInts.insert(input);

    std::cout << "Count: " << myInts.size();
}

帮自己一个忙,不要使用原始数组。查看STL。

答案 2 :(得分:0)

#include <algorithm>
#include <iostream>
#include <iterator>

using namespace std;
int main()
{
    vector<int> vec = {1,1,2,3,3,4,4,5,6,6};
    auto it = vec.begin();

    while(it != vec.end())
    {
        it = adjacent_find(vec.begin(),vec.end());
        if(it != vec.end())
            vec.erase(it);
            continue;
    }

    for_each(vec.begin(),vec.end(),[](const int elem){cout << elem;});
    return 0;
}

此代码使用C ++ 11进行编译。

答案 3 :(得分:0)

#include<iostream>
#include<stdio.h>
using namespace std;

int arr[10];
int n;

void RemoveDuplicates(int arr[]);
void Print(int arr[]);


 int main()
{

cout<<"enter size of an array"<<endl;
cin>>n;
 cout<<"enter array elements:-"<<endl;
for(int i=0;i<n ;i++)
{
    cin>>arr[i];
}
RemoveDuplicates(arr);
Print(arr);
}

 void RemoveDuplicates(int arr[])
{
   for(int i=0;i<n;i++)
{
    for(int j=i+1;j<n;)
    {
        if(arr[i]==arr[j])
        {
            for(int k=j;k<n;k++)
            {
                arr[k]=arr[k+1];

            }
            n--;
        }
        else
            j++;
    }
}
}

void Print(int arr[])
{
   for(int i=0;i<n;i++)
   {
      cout<<arr[i]<<"  ";
    }
 }