2011-10-28 105 views
0

我試圖設計一個地址簿,試圖做一個搜索,但我不斷收到分段錯誤。我知道這意味着什麼,但它爲什麼試圖分配正在使用的內存?爲什麼不搜索?分段錯誤,搜索返回錯誤

下面是代碼:

class contact{ 

private: 

    string fn="", ln="", email="", number=""; 

public: 
    void input(); 
    void output(); 
    void setfname(string f_n); 
    void setlname(string l_n); 

    void setemail(string emaila); 

    void setnumber(string num); 
    string getfname(); 
    string getlname(); 

    string getemail(); 

    string getnumber(); 

contact(); 
contact(string f_n, string l_n, string emaila,string num); 

}; 
void menu(string opt); 

int search_contacts(contact contacts[],int MAX, string search); 



int main(){ 

    string search; 

    const int MAX=2; 

    contact contacts[MAX]; 

    cout << "Enter up to " << MAX << " contacts.\n"; 

    for (int i = 1; i <= MAX; i++) 

    { 

    contacts[0].input(); 

    } 

    [menu function goes here] 

    contacts[0].output(); 

return 0; 

} 
int search_contacts(contact contacts[],int size, string search) 

{ 
cout << "Search contact by LastName:____ "; 

cin >> search; 

    bool lookup = false; 

    for(int index=0;index<size;index++) 

    { 

     if(contacts[index].getlname() == search) 

    { 

     lookup = true; 

     cout<<"Result found "<<endl; 

     break; 

    } 

    } 

if(!lookup) 

cout<<"no record found"<<endl; 

} 

void menu(string opt){ 
string search; 
contact contacts[0]; 
const int MAX = 2; 

[show menu msg...here] 

    cin>>opt; 

// do this if the option selected is search 

if(opt=="search") 

    { 

    search_contacts(contacts, MAX, search); 

} 
[more menu code] 
} 
void contact::input() 
{ 

cout<<"fn and ln separate by a space: "; 

cin>>fn>>ln; 

cout<<"email: "; 

cin>>email; 

cout<<"phone number: "; 

cin>>number; 

} 

void contact::output() 
{ 
[output code... goes here]; 

} 
string contact::getlname() 
{ 

return ln; 

} 

[functions that delegates the variables...goes here] 
+2

你是否通過調試器運行這個查找問題的位置? – GWW

+0

另見:http://stackoverflow.com/questions/2346806/what-is-segmentation-fault – mpontillo

回答

0

你不能做用,當你選擇匹配到「搜索」,並試圖找到相匹配的名字,你已經做==字符串比較。 http://www.cplusplus.com/reference/clibrary/cstring/strcmp/

+0

是的,這是我看到的另一個明顯的問題。指向搜索字符串的指針是使用'=='比較的內容。它永遠不會等於聯繫人列表中的指針。 – mpontillo

+2

我在帖子中看不到'strcmp'函數。 「當前帖子」使用'std :: string',它允許'operator ==()'。 –

+0

@Thomas,謝謝,我認爲你是對的。 (我更像一個C人,所以我忽略了'string'的使用。)這會使這個答案不正確。爲了記錄,在C或Java中使用'=='是一個明顯的錯誤。在C++或C#中,我認爲沒關係。 (儘管在C#中它讓我畏縮,來自Java背景!) – mpontillo

1

正如評論中所述,您應該瞭解如何使用調試器來確定爲什麼出現分段錯誤。

它在我看來你正試圖對不存在的聯繫人進行操作。我在menu()中看到一個零長度的數組,我看不到您在main()menu()函數中創建的聯繫人的方式,因此也沒有看到您的搜索功能。

如果您嘗試對未初始化的對象執行操作,您將看到像這樣的分段錯誤。

+0

確實,這很可能是問題。您將一個零大小的數組添加到搜索函數中,但將大小參數設置爲2。這是行不通的。還有一個提示:使用矢量而不是數組,它們更容易處理! – ElektroKraut