0

データ検証関数を作成しようとしています。この関数では、ID番号は構造体の配列内の一意の番号である必要があります。有効なID番号を保存しようとするたびに、プログラムがクラッシュします-なぜこれが発生するのですか?

これは構造体であり、構造体の配列の宣言です。

struct customer {                   // set up customer template    //
    char name [MAXNAM];
    char surname [MAXNAM];
    int idnum [MAX_ID];
    };
struct customer data_cus[MAXCUS];

これはメインプログラム内にあります:

printf ("Please Enter ID Card, [NOTE! Only numbers are allowed!]\n");
                int checkID;

                while ((scanf ("%d",&checkID) == 0 || customerID(checkID, count)==1))
                {
                    printf ("This ID is already taken! Please enter unique ID!\n");
                    while (getchar()!='\n')
                    {
                        continue;
                    }
                    *data_cus[count].idnum = checkID;
                }

IDをチェックするために使用される関数は次のとおりです。IDはファイルにすでに存在します。

int customerID (int cCheck, int count)
{
    FILE * pcustomer;
    int size = sizeof (struct customer);

    struct customer temp;

    rewind (pcustomer);
    while (fread (&temp,size,count,pcustomer)==1)
    {
        if (*temp.idnum == cCheck)
        {
            return 1;
        }
    }
    return 0;
}

ご協力ありがとうございました!

4

2 に答える 2

0

scanf正常に一致したアイテムの数を返します。つまり、次のことを意味していると思います。

while (scanf ("%d",&checkID) == 1 && customerID(checkID, count)==1).

count一意の ID を正常に読み取ったときにインクリメントのみを超えないようにする必要があります。また、各レコードには 1 つしかないMAXCUSため、整数の配列は必要ありません。idnum

また、関数customerIDは明らかに間違っています。ここでは、複数の構造体を読み取り、単一の構造体customerに書き込みます。これがおそらくクラッシュする理由です。tempcustomer

 while (fread (&temp,size,count,pcustomer)==1)

新しい ID が一意かどうかを確認するたびにファイルから読み取るのではなく、配列内の ID を追跡すると、はるかに簡単になります。

于 2012-12-23T11:06:49.507 に答える