【发布时间】:2015-03-08 16:58:25
【问题描述】:
这是一个地址:
struct Adress {
char name[31], lastname[31], email[48];
};
目标是在 main 函数中有一个通讯录,用户应该能够输入一个字符串,程序会列出通讯录中姓名或姓氏包含给定值的所有人细绳。 例如,如果通讯录中包含“john”、“doe”、“jane”、“doey”和“george”“johnson”,并且用户输入“doe”,则输出为:
1. john doe johndoe@email.com
2. jane doey janedoey@email.com
这部分主函数应该使用一个函数
int search(struct Adress array[], int size_of_the_addressbook, char* string_to_search)
返回第一个找到的地址的索引,如果没有找到地址,则返回-1。
这是我的尝试:
在我的主要功能的 sn-p 中(这里不需要发布输入内容):
struct Adress adressbook[1000], *member;
int i = 0;
member = adressbook;
if (search(member, number_of_elements, string_to_seach)) == -1)
printf("No person found.\n");
else while((search(member, number_of_elements, string_to_seach)) != -1)
{
member = adressbook + search(member, number_of_elements, string_to_seach);
++i;
printf("%d. %s %s - %s\n", i, (*member).name, (*member).lastname, (*member).email);
++member;
}
这里是搜索功能:
int search(struct Adress array[], int size_of_the_addressbook, char* string_to_search)
{
int j, index;
struct Adress *i;
i = array;
while (strstr((*i).name, string_to_search) == 0 && strstr((*i).lastname, string_to_search) == 0)
{
index = ((i - array)/(sizeof (struct Adress)));
if (index == size_of_the_addressbook) return -1;
++i;
}
index = ((i - array)/(sizeof (struct Adresa)));
return index;
}
但是,当通讯簿中有多个成员时,几乎任何情况下,此程序都会陷入无限循环。我怀疑在 while 循环中,搜索不是从先前找到的成员开始,而是每次都从头开始,因此每次都会找到相同的第一个找到的成员。
【问题讨论】:
-
为什么调用搜索两次??一次,保存结果,测试 -1,如果不是,将结果用作偏移量,而不是调用具有相同参数的相同函数 again ?而且你不需要
index在search中的除法计算。指针数学将为您做到这一点。index = (i - array);应该足以获得正确的索引。 -
嗯,如果没有这个除法,我将如何获得索引?而且我知道事情可以进行一些优化,但首先我需要让它工作并弄清楚为什么它会进入无限循环。
-
这是一段奇怪的代码。为什么不直接使用整数索引
i,它从0迭代到数组和引用的长度,array[i].name等?至于无限循环,size_of_the_addressbook在传递给函数之前是如何计算的? -
再次,指针算法。它在这段代码中做了两次,都是错误的。您正在做的事情不需要 sizeof 除法。
-
对。所以你在函数中的循环仍然可以将
int i从0迭代到number_of_elements-1引用array[i]。它会更干净,您的循环至少会正确终止,让您解决其他问题。