ошибка сегментации с помощью strcmp?

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

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

Если я ищу существующее имя, оно найдено, и все в порядке. Однако поиск несуществующего имени вызывает ошибку сегментации. Есть ли очевидная вещь, которую мне здесь не хватает?


person oz123    schedule 17.12.2011    source источник
comment
Ваша инициализация выглядит странно. Вы имеете в виду иметь только 0 байт в качестве начала? Затем вы должны инициализировать с помощью "", которая представляет собой 1-символьную строку, содержащую всего один 0 байт. Чтобы добиться этого намного проще, было бы просто назначить myContacts[i].cFirstName[0] = '\0';   -  person Jens Gustedt    schedule 18.12.2011


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

person SlavaNov    schedule 17.12.2011
comment
За исключением того, что цикл начинается с i=1, поэтому условие должно быть i <= num_of_contacts... Мораль: всегда начинайте с i=0... - person Yakov Galka; 18.12.2011
comment
да, спасибо, что указали. Привык к циклам for в Python :-/. - person oz123; 19.12.2011

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

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

person fge    schedule 17.12.2011

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

person Sid Malani    schedule 17.12.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, когда оно найдено!

person David Heffernan    schedule 17.12.2011