kjwyzz 2021-05-26 22:12 采纳率: 85.7%
浏览 51
已采纳

del函数中为什么删除的第二个学生信息会覆盖第一个删除的学生信息

#include <stdio.h>
#include <string.h>
#include<stdlib.h>
struct Student
{
    char num[10];
    char name[50];
    char age[10];
    char sex;
    struct birth
    {
        char year[10];
        char month[10];
        char day[10];
    } birthday;
    char address[50];
    char tel[20];
    char Email[50];
} stu,stu1;
void insert(struct Student *stu,int N)
{
    int i;
    printf("请根据提示按照格式录入信息!(性别用W(woman)或M(man)表示)\n");

    printf("学生学号\t学生姓名\t年龄\t性别\t出生年份\t出生月份\t出生日\t地址\t电话号码\t邮箱\n");
    for(i=0; i<N; i++)
        scanf("%s%s%s%s%s%s%s%s%s%s",&stu[i].num,stu[i].name,stu[i].age,&stu[i].sex,stu[i].birthday.year,stu[i].birthday.month,stu[i].birthday.day,stu[i].address,stu[i].tel,stu[i].Email);
    system("pause");
}
void disp(struct Student *stu,int N)
{
    int i;
    for(i=0; i<N; i++)
        printf("%s %s %s %c %s %s %s %s %s %s\n",stu[i].num,stu[i].name,stu[i].age,stu[i].sex,stu[i].birthday.year,stu[i].birthday.month,stu[i].birthday.day,stu[i].address,stu[i].tel,stu[i].Email);
    system("pause");
}

void find(struct Student *stu,int N)
{
    int i,n,flag=0;
    char name[20],xh[10];
    printf("请输入想要查询的方式:1 :按学号查找 2:按姓名查找\n");
    scanf("%d",&n);

    if(n==1)
    {
        printf("请输入要查找的学号:");
        scanf("%s",xh);

        for(i=0; i<N; i++)
            if(strcmp(xh,stu[i].num)==0)
            {
                flag = 1;
                printf("学生学号\t学生姓名\t年龄\t性别\t出生年份\t出生月份\t出生日\t地址\t电话号码\t邮箱\n");
                printf("--------------------------------------------------------------------\n");
                printf("%s %s %s %c %s %s %s %s %s %s\n",stu[i].num,stu[i].name,stu[i].age,stu[i].sex,stu[i].birthday.year,stu[i].birthday.month,stu[i].birthday.day,stu[i].address,stu[i].tel,stu[i].Email);
            }
        if (0 == flag)
            printf("该学号不存在!\n");
    }



    else if(n==2)
    {
        printf("请输入要查找的姓名:");
        scanf("%s",name);
        for(i=0; i<N; i++)
            if(strcmp(name,stu[i].name)==0)
            {
                flag = 1;
                printf("学生学号\t学生姓名\t年龄\t性别\t出生年份\t出生月份\t出生日\t地址\t电话号码\t邮箱\n");
                printf("--------------------------------------------------------------------\n");
                printf("%s %s %s %c %s %s %s %s %s %s\n",stu[i].num,stu[i].name,stu[i].age,stu[i].sex,stu[i].birthday.year,stu[i].birthday.month,stu[i].birthday.day,stu[i].address,stu[i].tel,stu[i].Email);
            }
        if (0 == flag)
            printf("该姓名不存在!\n");

    }

    else
        printf("NULL!");
    system("pause");


}


void modify( struct Student *stu,int N)
{
    int i, choice, num=-1,flag=0;
    char year[10],month[10],day[10];
    char sex,xh[10],name[20],tel[20],add[20],mail[20];
    printf("请输入要要修改的学生的学号:\n");
    scanf("%s", xh);
    for (i=0; i<N; i++)
    {
        num=i;
        if (strcmp(xh,stu[i].num)==0)
        {
            printf("------------------\n");
            printf("1.修改姓名\n");
            printf("2.修改年龄\n");
            printf("3.修改性别\n");
            printf("4.修改出生年份\n");
            printf("5.修改出生月份\n");
            printf("6.修改出生日\n");
            printf("7.修改地址\n");
            printf("8.修改电话号码\n");
            printf("9.修改邮箱\n");
            printf("10.修改结束!\n");
            while (flag==0)
            {
                printf("请选择:");
                scanf("%d", &choice);
                switch (choice)
                {
                case 1:
                    printf("请输入新的姓名:\n");
                    scanf("%s", name);
                    strcpy(stu[num].name, name);
                    break;
                case 2:
                    printf("请输入新的年龄:\n");
                    scanf("%s", stu[num].age);
                    break;
                case 3:
                    printf("请输入新的性别:\n");
                    scanf("%c", &sex);
                    stu[i].sex = sex;
                    break;
                case 4:
                    printf("请输入新的出生年份:\n");
                    scanf("%s", year);
                    strcpy(stu[num].birthday.year, year);

                    break;
                case 5:
                    printf("请输入新的出生月份:\n");
                    scanf("%s", month);
                    strcpy(stu[num].birthday.month,month);
                    break;
                case 6:
                    printf("请输入新的出生日:\n");
                    scanf("%s", day);
                    strcpy(stu[num].birthday.day, day);

                    break;
                case 7:
                    printf("请输入新的地址:\n");
                    scanf("%s", &add);
                    strcpy(stu[num].address, add);
                    break;
                case 8:
                    printf("请输入新的电话号码:\n");
                    scanf("%s", &tel);
                    strcpy(stu[num].tel, tel);
                    break;
                case 9:
                    printf("请输入新的邮箱:\n");
                    scanf("%s", &mail);
                    strcpy(stu[num].Email, mail);
                    break;
                case 10:
                    flag=1;
                    break;
                }
            }
            printf("修改完毕!请及时保存!\n");
        }
        else
        {
            printf("没有该学生学号!");
        }
    }
    system("pause");
}
void del(struct Student *stu,struct Student *stu1,int *N)
{
    FILE *fp1;
    fp1=fopen("d:\\ccccc\\stu1.txt","wt+");
    int i, j,flag = 0;
    int static k;
    k=-1;
    char s1[20],xh[10];
    printf("请输入要删除学生的学号:\n");
    scanf("%s", xh);
    for (i = 0; i <*N; i++)
    {
        if (strcmp(xh,stu[i].num)==0)
        {
            k++;
            stu1[k]=stu[i];


            fprintf(fp1,"%s %s %s %c %s %s %s %s %s %s\n",stu1[k].num,stu1[k].name,stu1[k].age,stu1[k].sex,stu1[k].birthday.year,stu1[k].birthday.month,stu1[k].birthday.day,stu1[k].address,stu1[k].tel,stu1[k].Email);
            fclose(fp1);

            flag = 1;
            for (j = i; j <(*N)-1; j++)
            {
                stu[j] = stu[j + 1];
            }
        }
    }
    if (flag==0)
    {
        printf("该学号不存在!\n");
    }
    if (flag==1)
    {
        printf("成功将该学生信息删除,并保留在stu1文档中!\n");

        (*N)--;
    }
    system("pause");
}
void add(struct Student *stu,int *N)
{
    int i,m,j,flag,k;
    k=(*N);
    printf("请输入待增加的学生数:\n");
    scanf("%d", &m);
    for(i=0; i<m; i++)
    {
        printf("请依次输入第%d位同学的信息:\n",k+1);
        printf("学生学号  学生姓名  年龄  性别  出生年份  出生月份  出生日  地址  电话号码  邮箱\n");
        scanf("%s%s%s%s%s%s%s%s%s%s",stu[(*N)+i].num,stu[(*N)+i].name,stu[(*N)+i].age,&stu[(*N)+i].sex,stu[(*N)+i].birthday.year,stu[(*N)+i].birthday.month,stu[(*N)+i].birthday.day,stu[(*N)+i].address,stu[(*N)+i].tel,stu[(*N)+i].Email);
        k++;
    }
    printf("学生信息添加成功!\n");

    (*N)=(*N)+m;
    system("pause");
}

void writeintofile(struct Student *stu,int N)
{
    FILE *fp;
    fp=fopen("d:\\ccccc\\stu.txt","wt+");
    for(int i=0; i<N; i++)
        fprintf(fp,"%s %s %s %c %s %s %s %s %s %s\n",stu[i].num,stu[i].name,stu[i].age,stu[i].sex,stu[i].birthday.year,stu[i].birthday.month,stu[i].birthday.day,stu[i].address,stu[i].tel,stu[i].Email);
    fclose(fp);
    printf("成功将学生信息写入文件stu中!\n");
    system("pause");
}
int main()
{
    int num,flag=1,N;
    printf("请输入要录入的学生信息个数\n");
    scanf("%d",&N);
    struct Student stu[50];
    struct Student stu1[50];
    while (flag!=0)
    {
        printf("  *************************************************\n\n");
        printf("  *                学生信息管理系统              *\n \n");
        printf("  *************************************************\n\n");
        printf("********************系统功能菜单*********************\n");
        printf("     ----------------------   ---------------------- \n");
        printf("     *********************************************   \n");
        printf("        1.录入学生信息         2.浏览当前信息        \n");
        printf("     *********************************************   \n");
        printf("     *  3.查询学生信息         4.修改学生信息        \n");
        printf("     *********************************************   \n");
        printf("     *  5.删除学生信息         6 增添学生信息        \n");
        printf("     ********************** **********************   \n");
        printf("     *7.将信息写入文件中       8.退出程序            \n");
        printf("     ----------------------   ---------------------- \n");
        printf("请选择菜单编号:");
        scanf("%d", &num);
        switch (num)
        {
        case 1:
            insert(stu,N);
            break;
        case 2:
            disp(stu,N);
            break;
        case 3:
            find(stu,N);
            break;
        case 4:
            modify(stu, N);
            break;
        case 5:
            del(stu,stu1, &N);
            break;
        case 6:
            add(stu,&N);
            break;
        case 7:
            writeintofile(stu,N);
            break;
        case 8:
            flag=0;
            printf("即将退出程序!");
        }
    }
    return 0;
}
  • 写回答

1条回答 默认 最新

  • qfl_sdu 2021-05-26 22:22
    关注

    看一下你贴出来的代码第184行。因为在每次进入del函数的时候,你都把k=-1了。找到学号后++,所以,每次都是把要删除的学生信息放在了stu1[0],也就是后面的把前面删除的给覆盖掉了。

    你把static int k; k = -1;这两句话合成一句,static int k = -1;。或者把k作为全局变量。

    del函数中,你文件打开方式不对,应该是fp1=fopen("d:\\ccccc\\stu1.txt","a+");这样才会在文件后面追加

    如有帮助,请采纳一下。谢谢。

     

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决