C:如何编写搜索函数在结构数组中查找匹配项,并返回(打印)匹配的整个结构?
for/while/if循环 搜索结构数组成员 如果找到匹配项 return打印找到匹配项的整个结构C:如何编写搜索函数在结构数组中查找匹配项,并返回(打印)匹配的整个结构?,c,search,loops,struct,C,Search,Loops,Struct,for/while/if循环 搜索结构数组成员 如果找到匹配项 return打印找到匹配项的整个结构 static char searchforRecordbystate(char input[3]) { 主要功能-第一次使用指针,xcode并没有抱怨它设置得尽可能严格,但欢迎大家抱怨,特别是如果我做了一个巨大的疏忽 return 0; } 用于数据输入的数组循环 int main() { typedef struct { char *firstN
static char searchforRecordbystate(char input[3])
{
主要功能-第一次使用指针,xcode并没有抱怨它设置得尽可能严格,但欢迎大家抱怨,特别是如果我做了一个巨大的疏忽
return 0;
}
用于数据输入的数组循环
int main() {
typedef struct {
char *firstName[RECORDS];
char *lastName[RECORDS];
char *street[RECORDS];
char *city[RECORDS];
char *state[RECORDS];
int *zip[RECORDS];
char *phone[RECORDS];
int *accountId[RECORDS];
} Customer ;
typedef int records;
records i = 0;
没有必要进行错误检查,只是目前正在尝试慢慢学习c。并且成员国中不会有重复数据。希望这能让事情变得容易些
如何编写搜索函数在结构中查找匹配项
数组并返回匹配的整个结构的printf
在函数外部声明struct数据类型,使其对整个模块可见。
创建一个能够漂亮打印结构的函数:
无效CustomerPrintconst客户*TopPrint{
...
}
创建一个搜索函数,通过比较给定参数来迭代数组:
客户*CustomerFindconst字符*名称{
...
}
通过调用CustomerFind连接两个功能块,如果结果不为NULL,则调用CustomerPrint函数
当然,接口只是建议,可能会发生更改。如果你对提案的细节有任何疑问,请留下评论,如果你愿意,我会详细解释
其他想法
在重读我的帖子时,我意识到我在上述提案中做出的一些决定无论如何都需要解释:
在CustomerPrint中,指针是“const”?因为此函数不会修改结构的任何字段。因此,我们告诉编译器我们不会改变任何东西
CustomerFind应具有所有可搜索字段的参数。因此,我们鼓励您扩展签名,我建议按指针获取所有比较值,并让调用者将那些与搜索无关的指针设为NULL。e、 g.如果您有名称和城市,您可以将城市保留为空,以便只搜索第一次出现的名称
函数本身遍历记录数组并比较非空字段。如果它找到一个,它将返回指向该元素的指针return&myRecords[n];。如果函数到达数组的末尾,它将返回NULL以指示没有匹配的记录
如果您想拥有搜索-搜索下一步功能,还可以引入一个概念。让我知道,如果你是在一个概念感兴趣的太多
Customer custArray[RECORDS];
printf("================================================================\n");
for(i = 0; i < RECORDS; ++i)
{
printf("Enter data for customer %d\n", i + 1);
printf("Enter firstname, last name, phone\n");
scanf("%s %s %s", *custArray[i].firstName, *custArray[i].lastName, *custArray[i].phone);
printf("Enter Address (Street City State ZIP)");
scanf("%s %s %s*c %d", *custArray[i].street, *custArray[i].city, *custArray[i].state, *custArray[i].zip);
break;
}
char input[3];
printf("Enter in state to search for customer a customer record:\n");
scanf("%s", input);
searchforRecordbystate(input);
}
如何编写搜索函数在结构中查找匹配项
数组并返回匹配的整个结构的printf
在函数外部声明struct数据类型,使其对整个模块可见。
创建一个能够漂亮打印结构的函数:
无效CustomerPrintconst客户*TopPrint{
...
}
创建一个搜索函数,通过比较给定参数来迭代数组:
客户*CustomerFindconst字符*名称{
...
}
通过调用CustomerFind连接两个功能块,如果结果不为NULL,则调用CustomerPrint函数
当然,接口只是建议,可能会发生更改。如果你对提案的细节有任何疑问,请留下评论,如果你愿意,我会详细解释
其他想法
在重读我的帖子时,我意识到我在上述提案中做出的一些决定无论如何都需要解释:
在CustomerPrint中,指针是“const”?因为此函数不会修改结构的任何字段。因此,我们告诉编译器我们不会改变任何东西
CustomerFind应具有所有可搜索字段的参数。因此,我们鼓励您扩展签名,我建议按指针获取所有比较值,并让调用者将那些与搜索无关的指针设为NULL。e、 g.如果您有名称和城市,您可以将城市保留为空,以便只搜索第一次出现的名称
函数本身遍历记录数组并比较非空字段。如果它找到一个,它将返回指向该元素的指针return&myRecords[n];。如果函数到达数组的末尾,它将返回NULL以指示没有匹配的记录
如果您想拥有搜索-搜索下一步功能,还可以引入一个概念。让我知道,如果你是在一个概念感兴趣的太多
Customer custArray[RECORDS];
printf("================================================================\n");
for(i = 0; i < RECORDS; ++i)
{
printf("Enter data for customer %d\n", i + 1);
printf("Enter firstname, last name, phone\n");
scanf("%s %s %s", *custArray[i].firstName, *custArray[i].lastName, *custArray[i].phone);
printf("Enter Address (Street City State ZIP)");
scanf("%s %s %s*c %d", *custArray[i].street, *custArray[i].city, *custArray[i].state, *custArray[i].zip);
break;
}
char input[3];
printf("Enter in state to search for customer a customer record:\n");
scanf("%s", input);
searchforRecordbystate(input);
}
编写printCustomer是读者的一项练习
编写printCustomer是读者的一项练习。您的问题是什么?或许,我们应该实施一项新的规则/政策,禁止任何不存在的问题?在帖子里。对不起,让我来编辑一下。更清楚一点。
您的客户结构看起来不正确。单个客户真的需要一系列姓名、街道、邮政编码等吗?@DevendraD.Chavan;不,应该是char firstName[32];或者其他大于10的大小。@junix:当有人遇到问题类型的问题时,现在不是引入动态内存分配的时候。是的,使用动态内存分配是可能的,但直到结构数组中的固定大小数组/字符串被舒适地处理为止。在这个阶段,这是不必要的复杂性。你的问题是什么?或许,我们应该实施一项新的规则/政策,禁止任何不存在的问题?在帖子里。对不起,让我来编辑一下。更清楚一点,你的客户结构看起来不对劲。单个客户真的需要一系列姓名、街道、邮政编码等吗?@DevendraD.Chavan;不,应该是char firstName[32];或者其他大于10的大小。@junix:当有人遇到问题类型的问题时,现在不是引入动态内存分配的时候。是的,使用动态内存分配是可能的,但直到结构数组中的固定大小数组/字符串被舒适地处理为止。在这个阶段,这是不必要的复杂性。您是否有意将记录按值传递给printCustomer?有点低效,不是吗?@junix是的,我不太担心这个问题,只是想让大家明白一般的观点。好吧,我明白。考虑到OP只是想慢慢学习c语言,我想说,如果有人也注意细节的话,给他精心编制的代码是很有必要的,因为这将是OP学习的一个例子。在我看来,只考虑一般要点,不考虑副作用而复制部分结构的风险太高。如果你想全力以赴,精心制作,请发表你自己的答案。我只有这么多时间。如果我做得好,客户也不会是一个全局变量。由于它是一个全局变量,printCustomer可以把i作为参数……如果我没有时间精心设计一篇文章,我就不会给出答案。这是因为我认为如果我发布了一些不太精巧的代码,这些代码对初学者来说似乎是可以复制的,但对他来说却有一些不太明显的缺陷,这对我来说是没有帮助的。但这是一个不同的讨论。我提出了我的观点,这就是我想要的。您是否有意将记录按值传递给printCustomer?有点低效,不是吗?@junix是的,我不太担心这个问题,只是想让大家明白一般的观点。好吧,我明白。考虑到OP只是想慢慢学习c语言,我想说,如果有人也注意细节的话,给他精心编制的代码是很有必要的,因为这将是OP学习的一个例子。在我看来,只考虑一般要点,不考虑副作用而复制部分结构的风险太高。如果你想全力以赴,精心制作,请发表你自己的答案。我只有这么多时间。如果我做得好,客户也不会是一个全局变量。由于它是一个全局变量,printCustomer可以把i作为参数……如果我没有时间精心设计一篇文章,我就不会给出答案。这是因为我认为如果我发布了一些不太精巧的代码,这些代码对初学者来说似乎是可以复制的,但对他来说却有一些不太明显的缺陷,这对我来说是没有帮助的。但这是一个不同的讨论。我提出了我的观点,这就是我想要的。
typedef struct {
char firstName[NAMEMAX];
char lastName[NAMXMAX];
char street[STREETMAX];
char city[CITYMAX];
char state[STATEMAX];
int zip;
char phone[PHONEMAX];
int accountId;
} Customer ;
Customer Customers[RECORDS];
static int searchforRecordbystate(char input[]) {
for (int i = 0; i < RECORDS; i++) {
if (strcmp(input, Customers[i].state) == 0) {
printCustomer(Customers[i]);
return i;
}
}
return -1; // Not found
}