#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);
}
}
运行结果如下:
数组如果只有两个元素,而删除的元素为数组的最后一个元素,那么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);
}
}
scanf("%lld",&stu[i].num); 你输入的学号以什么方式隔开 比如学号1 比如学号23,你这样不用逗号或别的符号隔开,它会有歧义认为1 2 3
题主代码的问题是:void backspace() 删除函数里,数组长度变化后,没有反馈给主函数,主函数里输出时还是数组原长度。