在函数void delete中出现问题,如何解决才能实现代码编译。

在函数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;
        }
    }
}

这句确定没问题?

img

&peo[N]是错误的。peo就是结构的首地址了。peo[N]代表数组第N个元素,这是越界访问