我正在尝试编写数据验证函数,其中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;
}
感谢您的帮助!
答案 0 :(得分:0)
scanf
会返回成功匹配的项目数,我想你的意思是:
while (scanf ("%d",&checkID) == 1 && customerID(checkID, count)==1).
当您成功读取唯一ID时,应确保count
不超过MAXCUS
,并且由于每条记录,您不需要idnum
的整数数组只有一个。
此外,函数customerID
显然是错误的,在这里您阅读了多个customer
结构并写入temp
这是一个customer
结构,这很有可能为什么崩溃:
while (fread (&temp,size,count,pcustomer)==1)
如果您每次要检查新ID是否唯一时,都要跟踪数组中的ID而不是从文件中读取数据会容易得多。
答案 1 :(得分:0)
idnum是一个整数数组。这真的是你想要的,而不只是一个简单的整数?
我很确定如果从结构中删除[MAX_ID]
,事情就会好得多。
但是,一旦我们看到ID检查代码之后的代码,我保留更改动机为何崩溃的权利。