C语言用覆盖的方法来删除数组中的元素,为什么输入时没有成功,求解

#include 
#include 
#define n 2
struct student
{
    long long num;
}stu[1000];
void backspace()//删除 
{
    int i,j,nn=n;
    printf("请输入要删除学生的学号:\n");
    long long N;
    scanf("%lld",&N);
    for(i=0;iif(stu[i].num==N)
        {
            for(j=i;j-1;j++)
            {
                stu[j].num=stu[j+1].num;
            }
            nn--;
        }
    }
}
int main()
{
    int i;
    printf("请输入学号:");
    for(i=0;iscanf("%lld",&stu[i].num);
    }
    backspace();
    for(i=0;iprintf("%lld",stu[i].num);
    }
}

运行结果如下:

img

数组如果只有两个元素,而删除的元素为数组的最后一个元素,那么backspace()里的第二个for循环那里不会执行,然后nn--让数组长度减少一个不能对n的值产生效果,所以会导致删除失败;

可以在这种情况下把最后一个数组元素用一个特定值来覆盖,如0;还有另外一种办法就是把n定义为全局变量,下面的例子采用第二种办法,修改如下:

#include <stdio.h>
#include <stdlib.h>
// #define n 2
int n=2;
struct student
{
    long long num;
}stu[1000];
void backspace()//删除 
{
    int i,j,nn=n;
    printf("请输入要删除学生的学号:\n");
    long long N;
    scanf("%lld",&N);
    for(i=0;i<nn;i++)
    {
        if(stu[i].num==N)
        {
            for(j=i;j<nn-1;j++)
            {
                stu[j].num=stu[j+1].num;
            }
            n--;
        }
    }
}
int main()
{
    int i;
    printf("请输入学号:");
    for(i=0;i<n;i++)
    {
        scanf("%lld",&stu[i].num);
    }
    backspace();
    for(i=0;i<n;i++)
    {
        printf("%lld\n",stu[i].num);
    }
}
 

img

scanf("%lld",&stu[i].num); 你输入的学号以什么方式隔开 比如学号1 比如学号23,你这样不用逗号或别的符号隔开,它会有歧义认为1 2 3

题主代码的问题是:void backspace() 删除函数里,数组长度变化后,没有反馈给主函数,主函数里输出时还是数组原长度。