2011-10-28 12 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'を使います。 –

+0

@トーマス、ありがとう、私はあなたが正しいと思います。 (私はCの人が多いので、 'string'の使用を見落としました)。レコードの場合、 '=='の使用はCまたはJavaの目立つエラーです。 C++やC#では、それは問題ないと思います。 (しかし、C#ではJavaのバックグラウンドから来てくれることになった!) – mpontillo

1

コメントに記載されているように、デバッガを使用してセグメンテーションフォルトが発生する理由を判断する方法を学習する必要があります。

存在しない連絡先の操作をしようとしているように見えます。 menu()に長さ0の配列があり、menu()関数のmain()で作成した連絡先がどのようにして取得されたのかわかりません。

初期化されていないオブジェクトに対して操作を実行しようとすると、このようなセグメント化エラーが表示されます。

+0

確かにこれはおそらく問題です。あなたはゼロサイズの配列を検索関数に与えますが、size引数を2に設定します。これは動作しません。もう1つのヒント:配列の代わりにベクターを使用すると、扱いがはるかに簡単になります! – ElektroKraut

関連する問題