2012-09-08 223 views
1

我在這裏看到一個較舊的帖子,詢問如何做相同的事情,但他們的方法是不同的,我很想知道我的程序中的漏洞。刪除數組中的重複項(C++)

我正在嘗試編寫一個接受字符到10個字符長度數組的程序。我希望程序通過識別一個重複項並將其右側的所有值移動到左邊一個來評估第一個數組位置並刪除稍後在數組中找到的任何重複項。陣列的'大小'然後減1。

我相信我用於刪除函數的邏輯是正確的,但程序只爲數組中的第一個值和第四個值打印'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; 
} 
+0

'if(target = array [loc + search])'你確定要在這裏做一個任務嗎?我認爲你應該使用'=='運算符。使用std :: string和STL算法,這可以更容易完成。 – Mahesh

+0

如何使用['std :: unique'](http://stdcxx.apache.org/doc/stdlibref/unique.html)? –

回答

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)接下來,不要擔心你的字和小節之間的空白。它可以用來識別錯誤和解釋錯誤。 5)您的循環實際執行替換有令人難以置信的複雜索引。如果你不是以replace = 0開始,而是從replace = search + 1開始,試試看,也許你會比其他索引變得簡單多了。

+0

非常感謝您的幫助。我得到我的代碼工作,缺少的'='是一個罪魁禍首,隨着char目標初始化爲a。我這樣做是因爲當我沒有設置它,只是寫'char target'時,編譯器會抱怨我使用變量'target'而沒有初始化它,所以我想我會將它初始化爲一個隨機字母並且該函數會覆蓋它,但'a'最終會覆蓋後續的數據。你知道爲什麼會這樣說嗎?我想過宣佈'char target'正在初始化它。 – codinglocc

+0

聲明目標是一個字符不會初始化它。它可能是任何東西,直到你真的把它放了。只是宣佈'目標'是一個'字母'並不能告訴任何人這是一個字母。 – Arunas