#include<stdio.h>
int main(){
int n,i,j,del,a[1000];
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
scanf("%d",&del);
int count=0;
for(i=0;i<n;i++){
if(a[i]==del){
count++;
for(j=i;j<n;j++){
a[j]=a[j+1];
}
for(j=0;j<(n-count);j++){
printf("%d ",a[j]);
}
printf("\n");
}
}
if(count==0){
for(j=0;j<n;j++){
printf("%d ",a[j]);
}
}
return 0;
}
预期结果
5 8 12 17 15 3 7 7 10
5 8 12 17 15 3 7 10
5 8 12 17 15 3 10
实际结果
5 8 12 17 15 3 7 7 10
5 8 12 17 15 3 7 10
删除操作那段代码有两个问题:(1)语法错误:for(j)那个循环中a[j]=a[j+1]导致数组越界了,a[j+1]的最后一个值取的是a[n]而非a[n-1];(2)逻辑错误:for(i)循环中,当发现a[i]是要删除的值时,将a[i+1]开始的各个数左移了一个空间,到此为止都正确,但是,这个操作之后a[i]是新的一个未做判断的值,但实际上循环下一次判断的是a[i+1]而非a[i],这导致新的a[i]没做判断,每一次删除都会导致漏判断一个数。建议改正:(1)for(j=i+1;j<n;j++)以及a[j-1]=a[j];(2)倒序检查,即从最后一个数字检查到第一个数字,for(i=n-1;i>=0;i--)
在if里加i--
也就是printf("\n");后面加个i--;