首先,事實上,如果不創建數組的新副本,您不能刪除數組中的元素。您只能用其他值覆蓋它們,並將實際使用的元素數保存在數組中。
下面是一個演示程序,顯示如何完成。名稱爲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