C: как бы я написал функцию поиска для поиска соответствия в массиве struct и возвращал (печатал) всю структуру, которую он сопоставлял?

#include  #include  #include  #define RECORDS 10 

Ниже приведена функция, о которой я прошу помощи.

 static char searchforRecordbystate(char input[3]) { 

для / while / if loop

поиск элементов массива struct

если совпадение найдено

return (print) всю структуру, в которой было найдено совпадение

  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 на данный момент. И не будет дубликатов данных в государстве-члене. Надеюсь, это облегчит ситуацию.

    как бы написать функцию поиска, чтобы найти совпадение в массиве struct и вернуть (printf) всю структуру, которую она сопоставила?

    1. Объявите структурный тип данных вне функции, чтобы он был «видимым» для всего модуля.
    2. Создайте функцию, которая может довольно печатать структуру:

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

    3. Создайте функцию поиска, которая выполняет итерацию через массив, сравнивая данные аргументы:

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

    4. Подключите два функциональных блока, вызвав CustomerFind и в случае, если результатом не является NULL вызовите функцию CustomerPrint .

    Конечно, интерфейсы являются только предложением и могут быть изменены. Если у вас есть какие-либо вопросы относительно деталей предложения, оставляйте комментарий, я объясню это подробно, если хотите.

    Дополнительные мысли

    Перечитывая свой пост, я понял, что некоторые из моих решений, которые я сделал в вышеупомянутом предложении, нуждаются в объяснении:

    В CustomerPrint выбранный указатель является `const? потому что эта функция не собирается изменять какое-либо поле структуры. Поэтому мы говорим компилятору, что мы ничего не изменим.

    Ожидается, что у CustomerFind будут аргументы для всех полей, доступных для поиска. (Поэтому вам рекомендуется расширять подпись), я бы предложил взять все «сравнительные» значения по указателю и позволить вызывающим абонентам эти указатели быть NULL которые не имеют отношения к поиску. (например, если у вас есть name и city вы можете оставить NULL city , чтобы искать только первое name .

    Сама функция проходит через массив записей и сравнивает поля, которые не являются NULL . В случае, если он находит один, он возвращает указатель на этот элемент ( return &(myRecords[n]); ). Если функция подходит к концу массива, она возвращает NULL чтобы указать, что никакая запись не соответствует.

    Существует также концепция, которую вы можете представить, если вы хотите иметь возможности «искать – искать дальше». Дайте мне знать, если вас тоже интересует концепция.

     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() - упражнение для читателя.