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

以下の関数は、私が助けを求めているものです。

static char searchforRecordbystate(char input[3])
{   

for / while /if ループ

構造体配列のメンバーを検索する

一致が見つかった場合

一致が見つかった構造体全体を返す (出力する)

    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 を学習しようとしているだけです。また、状態メンバーに重複データはありません。これが簡単になることを願っています。

4

2 に答える 2

3

構造体配列で一致を探し、一致した構造体全体を (printf) 返す検索関数を作成するにはどうすればよいですか?

  1. 関数の外で構造体データ型を宣言して、モジュール全体に「見える」ようにします。
  2. 構造体をきれいに印刷できる関数を作成します。

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

  3. 指定された引数を比較して配列を反復処理する検索関数を作成します。

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

  4. 2 つの関数ブロックを呼び出して接続しCustomerFind、結果が関数を呼び出さない場合にNULL備えCustomerPrintます。

もちろん、インターフェースは単なる提案であり、変更される可能性があります。提案の詳細について質問がある場合は、コメントを残してください。必要に応じて、詳細に説明します。

追加の考え

私の投稿を読み直しているうちに、上記の提案で下した決定のいくつかはとにかく説明が必要であることに気付きました:

CustomerPrintでは、取得されるポインターは「const?」です。この関数は構造体のフィールドを変更しないためです。したがって、何も変更しないことをコンパイラに伝えます。

CustomerFindには、検索可能なすべてのフィールドの引数が必要です。(したがって、署名を拡張することをお勧めします) すべての「比較」値をポインターで取得しNULL、検索に関係のないポインターを呼び出し元に許可することを提案します。(たとえばname、最初に出現しcityた.cityname

関数自体は、レコードの配列全体を実行し、そうでないフィールドを比較しますNULL。見つかった場合は、その要素へのポインターを返します ( return &(myRecords[n]);)。関数が配列の最後に来ると、NULL一致するレコードがないことを示すために戻ります。

「検索 - 次を検索」機能が必要な場合に導入できる概念もあります。そのためのコンセプトにも興味がある場合はお知らせください。

于 2013-02-23T07:12:15.033 に答える
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()ことは読み手の練習です。

于 2013-02-23T07:17:20.400 に答える