在函数void delete中出现问题
问题是在 void delete 之前需要使用非限定id,请问我需要怎么解决呢
我把void改成其他也不行,搜索过其他资料也不对
代码调试通过并且将问题解决。
#include<stdio.h>
#include <string.h>
#include<stdlib.h>
#include<string.h>
#define N 30
#pragma warning(disable:4996)
struct people
{
int jiankangma[32];//健康码
char number_id[36];//身份证
char name[18];//姓名
long long phone;//电话
char address[20];//所在地区
char sblb[30];//申报类别
char company[50];//所属单位名称
char jkzk[10];//健康状态
};
struct people peo[N];
void menu()
{
char ch;
printf("\n\n\t\t ** 欢迎使用健康申报系统 ** \n\n\n");
printf("\t\t请选择(1-6) :\n");
printf("\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("\t\t\t 1.查询人民信息\n");
printf("\t\t\t 2.修改人民信息\n");
printf("\t\t\t 3.添加人民信息\n");
printf("\t\t\t 4.删除人民信息\n");
printf("\t\t\t 5.浏览人民记录信息\n");
printf("\t\t\t 6.退出\n");
printf("\t\t************************************\n");
printf("\n\t\t你的选择是:");
//ch=getche();
};
void Findname() //用户自定义函数,实现对指定数据的查找功能。(名字)
{
char s[20]; //定义用户输入的学生姓名数据为char型,占20列。
int i=0;
printf("请输入要查询的姓名:");
scanf("%s",s);
while(strcmp(peo[i].name,s)!=0&&i<N)
i++; //当输入的姓名与当前姓名不相同时,i自增1,比较下一个成员。
if(i==N)
{
printf("未找到相关信息!\n");
}
printf("-------------------------------------------------------------------\n");
printf("健康码 身份证号 姓名 电话 所在地区 申报类别 所属单位名称 健康状况 \n");
printf("-------------------------------------------------------------------\n");
printf("%s %s %s %lld %s %s %s %s\n", peo[i].jiankangma, peo[i].number_id, peo[i].name, peo[i].phone, peo[i].address, peo[i].sblb, peo[i].company, peo[i].jkzk);
printf("-------------------------------------------------------------------\n");
} //以表列的形式输出查找到的成员的相关信息。
void Findnumber_id() //用户自定义函数,实现对指定数据的查找功能。(身份证)
{
char s[50]; //定义用户输入身份证号数据为char型,占20列。
int i=0;
printf("请输入要查询的人民身份证号:");
scanf("%s",s);
while(strcmp(peo[i].number_id,s)!=0&&i<N)
i++; //当输入的学号与当前学号不相同时,i自增1,比较下一个成员。
if(i==N)
{
printf("未找到相关学生信息!\n");
}
printf("-------------------------------------------------------------------\n");
printf("健康码 身份证号 姓名 电话 所在地区 申报类别 所属单位名称 健康状况 \n");
printf("-------------------------------------------------------------------\n");
printf("%s %s %s %lld %s %s %s %s\n", peo[i].jiankangma, peo[i].number_id, peo[i].name, peo[i].phone, peo[i].address, peo[i].sblb, peo[i].company, peo[i].jkzk);
printf("-------------------------------------------------------------------\n");
} //以表列的形式输出查找到的成员的相关信息。
void Insert() //用户自定义Insert函数,实现将学生信息插入指定位置的功能。
{
int i,j;
printf("请输入要插入的位置:");
scanf("%d",&i);
if(i>N)
{ //当要插入位置大于结构体数组元素总数时,直接将数据插入到结构体数组最后。
printf("输入人民健康码:");
scanf("%s",peo[N].jiankangma);
printf("输入人民身份证号:");
scanf("%s",peo[N].number_id);
printf("输入人民姓名:");
scanf("%s",peo[N].name);
printf("输入人民电话:");
scanf("%lld",&peo[N].phone);
printf("输入人民所在地区:");
scanf("%s",&peo[N].address);
printf("输入人民申报类别:");
scanf("%s",&peo[N].sblb);
printf("输入人民所属单位名称:");
scanf("%s",&peo[N].company);
printf("输入人民健康状况:");
scanf("%s",&peo[N].jkzk);
printf("信息输入成功!\n");
} //用户分别输入的各项信息,系统返回"输入成功"的信息。
else
{ //当要插入位置不大于结构体数组成员总数时,执行下述操作。
for(j=N-1;j>=i;j--)
{
j=j+1;
strcpy(peo[j+1].name,peo[j].name);
strcpy(peo[j+1].number_id,peo[j].number_id);
strcpy(peo[j+1].address,peo[j].address);
strcpy(peo[j+1].sblb,peo[j].sblb);
strcpy(peo[j+1].company,peo[j].company);
strcpy(peo[j+1].jkzk,peo[j].jkzk);
} //通过for循环语句,将第j+1项的各项数据赋值给第j项,直到要插入数据的位置为止,实现第i项之后的数据每项都向后移动一个位置。
printf("输入人民健康码:");
scanf("%s",peo[N].jiankangma);
printf("输入人民身份证号:");
scanf("%s",peo[N].number_id);
printf("输入人民姓名:");
scanf("%s",peo[N].name);
printf("输入人民电话:");
scanf("%d",&peo[N].phone);
printf("输入人民所在地区:");
scanf("%d",&peo[N].address);
printf("输入人民申报类别:");
scanf("%d",&peo[N].sblb);
printf("输入人民所属单位名称:");
scanf("%d",&peo[N].company);
printf("输入人民健康状况:");
scanf("%d",&peo[N].jkzk);
printf("信息输入成功!\n");
} //将用户输入的各项数据赋值到第i个位置中,实现数据的插入。
j++; //全局变量n自增1,保证插入的数据存储到结构体中。
i++;
}
void Input()//录入学生信息函数(添加)
{
int i;
FILE *fp;
//system("cls");
for (int i = 0; i < N; i++)
{//先将数据赋给结构体变量,而后再写入
printf("开始录入信息\n请先输入第%d名人民的健康码:\n", i + 1);
scanf("%s", peo[i].jiankangma);
printf("请输入第%d人民的身份证号:\n", i + 1);
scanf("%s", peo[i].number_id);
printf("请输入第%d名人民的姓名:\n", i + 1);
scanf("%s", peo[i].name);
printf("请输入第%d名人民的电话:\n", i + 1);
scanf("%lld", &peo[i].phone);
printf("请输入第%d名人民的地址:\n", i + 1);
scanf("%s", peo[i].address);
printf("请输入第%d名人民的申报类别:\n", i + 1);
scanf("%s", peo[i].sblb);
printf("请输入第%d名人民的所属单位名称:\n", i + 1);
scanf("%s", peo[i].company);
printf("请输入第%d名人民的健康状况:\n", i + 1);
scanf("%s", peo[i].jkzk);
// system("cls");
fp=fopen("D\\代码\\健康申报系统名单.txt","r");
fwrite(&peo[0],sizeof(peo[0]),N,fp);
fclose(fp);
}
// writeinfo();//调用文件写入函数写入数据
};
void Output() //用户自定义Output函数,实现数据的输出功能。M
{
int i;
printf("-------------------------------------------------------------------\n");
printf("健康码 身份证号 姓名 电话 所在地区 申报类别 所属单位名称 健康状况\n");
printf("-------------------------------------------------------------------\n");
for (i = 0; i < N; i++)
{
printf("%s %s %s %lld %s %s %s %s\n", peo[i].jiankangma, peo[i].number_id, peo[i].name, peo[i].phone, peo[i].address, peo[i].sblb, peo[i].company, peo[i].jkzk);
printf("-------------------------------------------------------------------\n");
} //使用for循环语句,输出结构体中所有成员信息。
};
void delete()
{
long x;
int j,i=0;
FILE *fp;
int n=0;
if((fp=fopen("D\\代码\\健康申报系统名单.txt","r"))==NULL){
printf("文件错误");
return;
}
while (!feof(fp))
{
if((fread(&peo[N],sizeof(struct people),1,fp)))
n++;
}
fclose(fp);
printf("输入要删除的身份证号:");
scanf("%s",&x);
while(peo[i].number_id!=x&&i<n)
i++; //比较输入的 x 数据与结构体中身份证号,若不相同,i 自增 1
if(i==n)
{
printf("未找到相关人员!\n");
return;
}
} //若 i 与 n 值相同,说明无此数据,输出“未找到信息!
void main()
{
char c;
for()
{
menu();
ch=getche();
switch(ch);
{
case 1:
switch(find())
{
case 1:findname();break;
case 2:Findnumber_id();break;
}
case 2:Insert();break;
case 3:Input();break;
case 4:delete();break;
case 5:Output();break;
case 0:exit(0);break;
default:printf("*输入错误!*");break;
}
}
}
修改完善如下,供参考:
#pragma warning(disable:4996)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 1000
struct people
{
char jiankangma[32];//健康码 int jiankangma[32];
char number_id[36];//身份证
char name[18];//姓名
long long phone;//电话
char address[20];//所在地区
char sblb[30];//申报类别
char company[50];//所属单位名称
char jkzk[10];//健康状态
};
struct people peo[N];
int max_N = 0;
void menu()
{
//char ch;
printf("\n\n\t\t ** 欢迎使用健康申报系统 ** \n\n\n");
printf("\t\t请选择(1-6) :\n");
printf("\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("\t\t\t 1.查询人民信息\n");
printf("\t\t\t 2.插入人民信息\n");
printf("\t\t\t 3.添加人民信息\n");
printf("\t\t\t 4.删除人民信息\n");
printf("\t\t\t 5.浏览人民记录信息\n");
printf("\t\t\t 6.退出\n");
printf("\t\t************************************\n");
printf("\n\t\t你的选择是:");
//ch=getche();
};
void Findname() //用户自定义函数,实现对指定数据的查找功能。(名字)
{
char s[20]; //定义用户输入的学生姓名数据为char型,占20列。
int i = 0;
printf("请输入要查询的姓名:");
scanf("%s", s);
while (strcmp(peo[i].name, s) != 0 && i < max_N)
i++; //当输入的姓名与当前姓名不相同时,i自增1,比较下一个成员。
if (i == max_N)
{
printf("未找到相关信息!\n");
return;
}
printf("-------------------------------------------------------------------\n");
printf("健康码 身份证号 姓名 电话 所在地区 申报类别 所属单位名称 健康状况 \n");
printf("-------------------------------------------------------------------\n");
printf("%s %s %s %lld %s %s %s %s\n", peo[i].jiankangma, peo[i].number_id,
peo[i].name, peo[i].phone, peo[i].address, peo[i].sblb, peo[i].company, peo[i].jkzk);
printf("-------------------------------------------------------------------\n");
} //以表列的形式输出查找到的成员的相关信息。
void Findnumber_id() //用户自定义函数,实现对指定数据的查找功能。(身份证)
{
char s[36]; //定义用户输入身份证号数据为char型。
int i = 0;
printf("请输入要查询的人民身份证号:");
scanf("%s", s);
while (strcmp(peo[i].number_id, s) != 0 && i < max_N)
i++; //当输入的学号与当前学号不相同时,i自增1,比较下一个成员。
if (i == max_N)
{
printf("未找到相关学生信息!\n");
return;
}
printf("-------------------------------------------------------------------\n");
printf("健康码 身份证号 姓名 电话 所在地区 申报类别 所属单位名称 健康状况 \n");
printf("-------------------------------------------------------------------\n");
printf("%s %s %s %lld %s %s %s %s\n", peo[i].jiankangma, peo[i].number_id,
peo[i].name, peo[i].phone, peo[i].address, peo[i].sblb, peo[i].company, peo[i].jkzk);
printf("-------------------------------------------------------------------\n");
} //以表列的形式输出查找到的成员的相关信息。
void Insert() //用户自定义Insert函数,实现将学生信息插入指定位置的功能。
{
int i, j;
if (max_N >= N) return; //插入数超过最大容量,不允许插入操作。
printf("请输入要插入的位置:");
scanf("%d", &i);
if (i > max_N || i <= 0)
{ //当要插入位置大于结构体数组元素总数时,直接将数据插入到结构体数组最后。
printf("输入人民健康码:");
scanf("%s", peo[max_N].jiankangma);
printf("输入人民身份证号:");
scanf("%s", peo[N].number_id);
printf("输入人民姓名:");
scanf("%s", peo[max_N].name);
printf("输入人民电话:");
scanf("%lld", &peo[max_N].phone); //scanf("%d", &peo[N].phone);
printf("输入人民所在地区:");
scanf("%s", peo[max_N].address); //scanf("%d", &peo[N].address);
printf("输入人民申报类别:");
scanf("%s", peo[max_N].sblb);
printf("输入人民所属单位名称:");
scanf("%s", peo[max_N].company);
printf("输入人民健康状况:");
scanf("%s", peo[max_N].jkzk);
printf("信息输入成功!\n");
} //用户分别输入的各项信息,系统返回"输入成功"的信息。
else
{ //当要插入位置不大于结构体数组成员总数时,执行下述操作。
for (j = max_N; j >= i; j--)
{
peo[j] = peo[j - 1];
//strcpy(peo[j + 1].name, peo[j].name);
//strcpy(peo[j + 1].number_id, peo[j].number_id);
//strcpy(peo[j + 1].address, peo[j].address);
//strcpy(peo[j + 1].sblb, peo[j].sblb);
//strcpy(peo[j + 1].company, peo[j].company);
//strcpy(peo[j + 1].jkzk, peo[j].jkzk);
} //通过for循环语句,将第j+1项的各项数据赋值给第j项,直到要插入数据的位置为止,
//实现第i项之后的数据每项都向后移动一个位置。
printf("输入人民健康码:");
scanf("%s", peo[i-1].jiankangma);
printf("输入人民身份证号:");
scanf("%s", peo[i-1].number_id);
printf("输入人民姓名:");
scanf("%s", peo[i-1].name);
printf("输入人民电话:");
scanf("%lld", &peo[i-1].phone);
printf("输入人民所在地区:");
scanf("%s", peo[i-1].address);
printf("输入人民申报类别:");
scanf("%s", peo[i-1].sblb); //scanf("%d", &peo[N].sblb);
printf("输入人民所属单位名称:");
scanf("%s", peo[i-1].company); //scanf("%d", &peo[N].company);
printf("输入人民健康状况:");
scanf("%s", peo[i-1].jkzk); //scanf("%d", &peo[N].jkzk);
printf("信息输入成功!\n");
} //将用户输入的各项数据赋值到第i个位置中,实现数据的插入。
max_N++; //全局变量n自增1,保证插入的数据存储到结构体中。
}
void Input()//录入学生信息函数(添加)
{
int i = 1;
//system("cls");
do { //for (int i = 0; i < N; i++)
//先将数据赋给结构体变量,而后再写入
printf("开始录入信息\n请先输入第%d名人民的健康码:\n", max_N + 1);
scanf("%s", peo[max_N].jiankangma);
printf("请输入第%d人民的身份证号:\n", max_N + 1);
scanf("%s", peo[max_N].number_id);
printf("请输入第%d名人民的姓名:\n", max_N + 1);
scanf("%s", peo[max_N].name);
printf("请输入第%d名人民的电话:\n", max_N + 1);
scanf("%lld", &peo[max_N].phone);
printf("请输入第%d名人民的地址:\n", max_N + 1);
scanf("%s", peo[max_N].address);
printf("请输入第%d名人民的申报类别:\n", max_N + 1);
scanf("%s", peo[max_N].sblb);
printf("请输入第%d名人民的所属单位名称:\n", max_N + 1);
scanf("%s", peo[max_N].company);
printf("请输入第%d名人民的健康状况:\n", max_N + 1);
scanf("%s", peo[max_N].jkzk);
max_N++;
if (max_N >= N) {
printf("记录已满,退出添加!");
break;
}
printf("是否继续添加信息(1.继续 0.退出):");
scanf("%d", &i);
} while (i);
} //;
void writeinfo()
{
FILE* fp;
fp = fopen("D:\\健康申报系统名单.txt", "w");
if (fp == NULL) return;
fwrite(peo, sizeof(struct people), max_N, fp);
fclose(fp);
}
void readinfo()
{
FILE* fp;
if ((fp = fopen("D:\\健康申报系统名单.txt", "r")) == NULL) {
printf("读文件错误\n");
return;
}
while (1){
if (fread(&peo[max_N], sizeof(struct people), 1, fp) != 1) break;
max_N++;
}
fclose(fp);
}
void Output() //用户自定义Output函数,实现数据的输出功能。M
{
int i;
if (max_N <= 0) return;
printf("-------------------------------------------------------------------\n");
printf("健康码 身份证号 姓名 电话 所在地区 申报类别 所属单位名称 健康状况\n");
printf("-------------------------------------------------------------------\n");
for (i = 0; i < max_N; i++)
{
printf("%s %s %s %lld %s %s %s %s\n", peo[i].jiankangma, peo[i].number_id,
peo[i].name, peo[i].phone, peo[i].address, peo[i].sblb, peo[i].company, peo[i].jkzk);
printf("-------------------------------------------------------------------\n");
} //使用for循环语句,输出结构体中所有成员信息。
}
void Delete()
{
char x[36]; //long x;
int j, i = 0;
printf("输入要删除的身份证号:");
scanf("%s", x); //scanf("%s", &x);
//while (peo[i].number_id != x && i < n)
while (strcmp(peo[i].number_id, x) != 0 && i < max_N)
i++; //比较输入的 x 数据与结构体中身份证号,若不相同,i 自增 1
if (i == max_N)
{
printf("未找到相关人员!\n");
return;
}
else {
for (j = i; j < max_N - 1; j++)
peo[j] = peo[j + 1];
max_N--;
}
} //若 i 与 n 值相同,说明无此数据,输出“未找到信息!
void main()
{
//char ch;
int ch;
readinfo();
for (;;)
{
menu();
scanf("%d", &ch); //ch = getche();
switch (ch) //;
{
case 1:
int find;
do {
printf("1.按姓名查找\n2.按身份证号查找\n请选择(1-2):");
scanf("%d", &find);
} while (find < 1 || find>2);
switch (find) //find()
{
case 1:Findname(); break; //findname()
case 2:Findnumber_id(); break;
}
break;
case 2:Insert();break;
case 3:Input(); break;
case 4:Delete();break;
case 5:Output();break;
case 6:writeinfo(); exit(0); break;
default:printf("*输入错误!*"); break;
}
}
}
这句确定没问题?
&peo[N]是错误的。peo就是结构的首地址了。peo[N]代表数组第N个元素,这是越界访问