C:如何编写搜索函数在结构数组中查找匹配项,并返回(打印)匹配的整个结构?

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

for/while/if循环

搜索结构数组成员

如果找到匹配项

return打印找到匹配项的整个结构

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
}