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它,因为它是1在尚未找到名称的时候,但0在它找到的时候!

于 2011-12-17T20:56:18.330 回答