首先,事实上,如果不创建数组的新副本,您不能删除数组中的元素。您只能用其他值覆盖它们,并将实际使用的元素数保存在数组中。
下面是一个演示程序,显示如何完成。名称为n
的变量用于保留数组中实际使用的元素行数。
#include <stdio.h>
#define N 10
int all_of_even(const int *row, size_t n)
{
size_t i = 0;
while (i < n && row[i] % 2 == 0) i++;
return i == n;
}
int main(void)
{
int a[][N] =
{
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 },
{ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 },
{ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 },
{ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 },
{ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 },
{ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 },
{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 },
{ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 }
};
const size_t M = sizeof(a)/sizeof(* a);
size_t n = M;
for (size_t i = 0; i < n; i++)
{
for (size_t j = 0; j < N; j++) printf("%d ", a[i][j]);
printf("\n");
}
printf("\n");
n = 0;
for (size_t i = 0; i < M; i++)
{
if (!all_of_even(a[i], N))
{
if (n != i)
{
for (size_t j = 0; j < N; j++) a[n][j] = a[i][j];
}
++n;
}
}
for (size_t i = 0; i < n; i++)
{
for (size_t j = 0; j < N; j++) printf("%d ", a[i][j]);
printf("\n");
}
printf("\n");
return 0;
}
程序输出是
0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 1
2 2 2 2 2 2 2 2 2 2
3 3 3 3 3 3 3 3 3 3
4 4 4 4 4 4 4 4 4 4
5 5 5 5 5 5 5 5 5 5
6 6 6 6 6 6 6 6 6 6
7 7 7 7 7 7 7 7 7 7
8 8 8 8 8 8 8 8 8 8
9 9 9 9 9 9 9 9 9 9
1 1 1 1 1 1 1 1 1 1
3 3 3 3 3 3 3 3 3 3
5 5 5 5 5 5 5 5 5 5
7 7 7 7 7 7 7 7 7 7
9 9 9 9 9 9 9 9 9 9
至于你的方法,那么它是低效的,因为与检查的条件,而不是复制数组中的所有行给定行后只复制一个每次迭代行。
此外,同时更改for循环体内和for语句本身的控制变量是一种不好的做法。这使得难以阅读代码。
这取决于你如何实现“2D数组”,但基本上通过删除列(你确定要删除列而不是行吗?)或在列之后移动列,覆盖要删除的列。 – MikeCAT
排*,对不起 –
情况看起来很奇怪。请发布[最小,完整和可验证示例](http://stackoverflow.com/help/mcve)。 – MikeCAT