2011-12-17 9 views
2

私のコードがクラッシュする理由を理解しようとしています。strcmpによるセグメント化の失敗?

address myContacts[5]; 

for (i = 0; i < 5 ; i++){ 
     strcpy(myContacts[i].cFirstName, "0"); 
     strcpy(myContacts[i].cLastName,"0"); 
     strcpy(myContacts[i].cTelphone,"0"); 
    } 

これは動作します:私はこのような配列の初期化コードで

typedef struct contact { 

    char cFirstName[10]; 
    char cLastName[10]; 
    char cTelphone[12]; 

} address ; // end type 

:私はこのように見える構造体の配列を持っているので、

for (i = 0; strcmp(myContacts[i].cFirstName,"0") != 0 ; i++){            
     printf("\nmyContacts[%d].cFirstName: %s", i, \ 
     myContacts[i].cFirstName); 
    }// end for 

を、私は唯一の印刷コンテンツを持つ連絡先を削除します。

しかし、私は下の私の検索接触機能が動作しない理由を立つことはできません。

void searchContact(address * myContacts, char * name){ 
    int found = 1; 
    int i = 0; 

    for (i = 1; found != 0 ;i++){ 
    found=strcmp(myContacts[i-1].cFirstName, name); 

    printf(" Name Found %s", myContacts[i-1].cFirstName); 
    } 
} // end of searchContacts 

が、私はこのように、この関数を呼び出す:私は既存の名前を検索する場合

printf("\nEnter a name or part of a name to search:\n"); 
      fscanf(stdin, "%s", buffer); 
      getchar(); // clear the last enter 
      printf("\nThe line you entered was:\n"); 
      printf("%s\n", buffer); 
      searchContact(myContacts, buffer); 

をそれ見つけられ、すべてがOKです。ただし、既存の名前がない を検索すると、セグメンテーション違反が発生します。 私はここに欠けている明白なことはありますか?

+0

初期設定が奇妙に見えます。最初に0バイトしか持たないのですか?次に '' "で初期化する必要があります。これは1バイトの文字列であり、' 0'バイトが1つしかありません。それをもっと簡単にする方法は、 'myContacts [i] .cFirstName [0] = '\ 0';' –

答えて

4

probelmはここにある:

 for (i = 1; found != 0 ;i++){ 
     found=strcmp(myContacts[i-1].cFirstName, name); 

     printf(" Name Found %s", myContacts[i-1].cFirstName); 
     } 

あなたがそうあなたは、配列の出入りfor (i = 1; found != 0 && i < num_of_contacts ;i++) のようなものを追加する必要があります!

+0

を割り当てることです。ループは 'i = 1'から始まるので、条件は' i < = num_of_contacts' ... Morale:常に 'i = 0'で始まります... – ybungalobill

+0

はい、ありがとうございます。 Pythonでforループに慣れている: - /。 – Oz123

1

はいあります:配列の最後を過ぎて循環します。あなたのループはまったく限定されていません。

myContactsのルーピングを実際に保持する値の数に制限する必要があります。

1

検索は問題がここにある任意の結果

1

見つからない場合は、ループを終了することはありません:

for (i = 1; found != 0 ;i++) { 
    found=strcmp(myContacts[i-1].cFirstName, name); 
} 

あなたがnameが見つからない場合は、ループは、配列の末尾を超えて継続し。 forループに余分なテストを追加する必要があります。一致するものが見つからずに配列の最後に到達すると、ループを終了させます。

なぜなら、あなたのforループが1で始まる理由はわかりません。

for (i=0; found!=0 && i<5; i++) { 
    found = strcmp(myContacts[i].cFirstName, name); 
} 

また、あなたのfound変数が悪いという名前の感じている:このようにそれを行うために、より自然だろう。名前が見つからない場合は1なので、notfoundとする必要がありますが、それがあるときは0です!

関連する問題