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

时间:2013-02-23 06:59:10

标签: c search loops struct

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define RECORDS 10  

以下功能是我要求帮助的。

static char searchforRecordbystate(char input[3])
{   

for / while / if loop

搜索struct array members

如果找到匹配

返回(打印)找到匹配项的整个结构

    return 0;
}   

主要功能 - 第一次使用指针,(xcode没有抱怨它设置得尽可能严格)但是欢迎大家抱怨,特别是如果我正在进行巨大的疏忽。

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;  

数据输入的数组循环

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

}   

此刻无需进行错误检查,只是尝试抓取进入学习c。并且州成员中不会有重复数据。希望这会让这更容易。

2 个答案:

答案 0 :(得分:3)

  

如何编写搜索函数以在结构中查找匹配项   array和return(printf)匹配的整个struct?

  1. 在函数外部声明struct数据类型,使其对整个模块“可见”。
  2. 创建一个能够漂亮打印结构的函数:

    void CustomerPrint(const Customer *toPrint) { ... }

  3. 创建一个搜索函数,迭代数组,比较给定的参数:

    Customer *CustomerFind(const char *name) { ... }

  4. 通过调用CustomerFind连接两个功能块,如果结果不是NULL则调用CustomerPrint功能。

  5. 当然接口只是提案,可能会被更改。如果您对提案的细节有任何疑问,请发表评论,如果您愿意,我会详细解释。

    其他想法

    在重读我的帖子时,我意识到我在上述提案中做出的一些决定无论如何都需要解释:

    CustomerPrint 中,指针是`const?因为此函数不会修改结构的任何字段。因此,我们告诉编译器我们不会改变任何东西。

    CustomerFind 应该包含所有可搜索字段的参数。 (所以鼓励你扩展签名)我建议用指针取所有“比较”值,并让调用者指出那些与搜索无关的指针NULL。 (例如,如果您有namecity,则可以将city设为NULL,以便仅搜索name的第一次出现。

    函数本身遍历记录数组并比较非NULL的字段。如果找到一个,它返回指向该元素的指针(return &(myRecords[n]);)。如果函数到达数组的末尾,它将返回NULL以指示没有匹配的记录。

    如果您想要“搜索 - 搜索下一步”功能,还可以引入一个概念。如果你对这个概念感兴趣,请告诉我。

答案 1 :(得分:2)

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
}

写作printCustomer()是读者的练习。