ошибка сегментации с помощью strcmp? - PullRequest
2 голосов
/ 18 декабря 2011

Я пытаюсь понять, почему мой код падает. У меня есть массив структур, которые выглядят так:

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 голосов
/ 18 декабря 2011

Проблема здесь:

        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++ ), иначе вы выйдете из массива!

1 голос
/ 18 декабря 2011

Проблема здесь:

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, поскольку это 1, когда имя не найдено, но 0, когда оно имеет!

1 голос
/ 18 декабря 2011

Вы никогда не завершите цикл, если поиск не найдет результатов

1 голос
/ 18 декабря 2011

Да, есть: вы перебираете конец массива. Ваши петли вообще не ограничены.

Вы должны ограничить цикл на myContacts тем количеством значений, которое оно действительно содержит.

...