删除数组中的重复项(C ++)

时间:2012-09-08 05:27:01

标签: c++ arrays duplicates

我在这里看到一篇较老的帖子,询问如何做相对相同的事情,但他们的方法不同,我有兴趣知道我的程序中的漏洞。

我正在尝试编写一个程序,将字符接受为10个字符长度的数组。我希望程序评估第一个数组位置并删除它稍后在数组中找到的任何重复项,方法是识别副本并将其右侧的所有值向左移动一个。然后,数组的“大小”减少一个。

我相信我用于删除功能的逻辑是正确的,但程序只为数组中的第一个值和第四个值打印'a'。

非常感谢任何帮助,这是我的代码:

#include <iostream>
using namespace std;

int letter_entry_print(int size, char array[10]);
int delete_repeats(int& size, char array[10]);
int final_array_print(int size, char array[10]);

int main()
{
    char array[10];
    int size = 10;

    letter_entry_print(size,array);
    delete_repeats(size,array);
    final_array_print(size,array);

    cout<<"\n";
    system("pause");
}

int letter_entry_print(int size, char array[10])
{
    int i;

    for (i=0;i<size;i++)
    {
        cout << "Enter letter #" << i+1 << endl;
        cin >> array[i];
        cout << "\n";
    }

    cout << "\nYour array index is as follows:\n\n";

    for (i=0;i<size;i++)
    {
        cout << array[i];
        cout << " ";
    }

    cout <<"\n\n";
    return 0;
}

int delete_repeats(int& size, char array[10])
{
    int ans;
    int loc;
    int search;
    int replace;
    char target='a';

    cout << "Enter 1 to delete repeats.\n\n";
    cin >> ans;
    if(ans==1)
    {
        for(loc=0;loc<size;loc++)
        {
            array[loc]=target;
            for(search=1;search<(size-loc);search++)
            {
                if(target=array[loc+search])
                {
                    for(replace=0;replace<(size-(loc+search));replace++)
                    {
                        array[loc+search+replace]=array[loc+search+replace+1];
                        array[size-1]=0;
                        size=(size-1);
                    }
                }
            }
        }
    }else(cout<<"\nWhy didn't you press 1?\n\n");
    return 0;
}

int final_array_print(int size, char array[10])
{
    cout<<"\nYour new index is as follows:\n\n";
    int i;
    for(i=0;i<size;i++)
    {
        cout<<array[i];
        cout<<" ";
    }

    cout<<"\n";
    return 0;
}

1 个答案:

答案 0 :(得分:1)

好的,您的代码有一些看起来很奇怪的东西。

1)你在整个地方重复10点,你无法合理地改变它,但你也会传递大小。不要让所有函数都使用10个字符的数组,而是考虑只传入一个指向char的指针,如:

int final_array_print(int size, char *array)

然后您可以更轻松地更改阵列的大小。如果你要将自己永远限制在10个项目中,那么到处传递大小是没有意义的,如果你提供一个大小的话,没有充分的理由传递10个项目的数组!

2)好的,所以现在你要寻找重复项。为什么用'a'覆盖数组中的第一个元素?

 char target='a';
...
array[loc]=target;

你不想反过来做吗?

3)接下来,正如@Mahesh指出的那样,你可能想要在查找重复项时使用比较运算符'=='而不是赋值运算符=:

if(target=array[loc+search])

应该是

if(target == array[loc+search])

4)接下来,dontbeafraidtousealittlewhourspace betweenyourwordsandpunctuation.Itmakesitaloteasientifytypingingfistakesandspellingerrors。

5)实际执行替换的循环具有非常复杂的索引。如果你没有以replace = 0开头会更容易,但只需从replace = search + 1开始,尝试一下,也许你所有其他索引变得简单多了。