2

コードがクラッシュする理由を理解しようとしています。私は次のような構造体の配列を持っています:

typedef struct contact {

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

} address ; // end type

コードでは、次のように配列を初期化します。

address myContacts[5];

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

これは機能します:

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 );

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

4

4 に答える 4

4

プローブはここにあります:

        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++ ) そうしないと、配列から外れるようなものを追加する必要があり ます。

于 2011-12-17T20:55:00.063 に答える
1

はい、あります。配列の終わりを過ぎて循環します。ループはまったく制限されていません。

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

于 2011-12-17T20:54:53.283 に答える
1

検索で結果が見つからない場合、ループを終了することはありません

于 2011-12-17T20:55:39.243 に答える
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変数の名前が適切でないと感じます。名前が見つからないときですが、見つかったときなnotfoundので、おそらく呼び出す必要があります。10

于 2011-12-17T20:56:18.330 に答える