排序功能删除数组的部分,C

时间:2014-11-14 01:53:12

标签: c++ c arrays sorting

我有这个非常奇怪的问题。您将在瞬间看到的功能应该确保2D阵列中的所有元素(字符)都在最大位置,也就是说,任何字符上方都没有空白区域。例如,董事会看起来像这样:

1 X * * X ^
2   * X ^ *
3 o o * X ^
4 o ^ X X X
5 ^ * X * ^
  1 2 3 4 5

在(2,1)处存在问题,因为非空白空间上方有空格。

我的函数正确地进行了排序,但它删除了底行上面有空白空格的任何字符。对于我的生活,我不能弄明白为什么。这是我的排序功能。

int bb_float_one_step(BBoard board){
int i,j;
for (i = 0; i < board->rows; i++){
    for (j = 0; j < board->cols; j++){
        if (board->boardDim[i][j] == None && (board->boardDim[i + 1][j] != None && i + 1 <= board->rows)){
            char tmp = board->boardDim[i + 1][j];
            board->boardDim[i + 1][j] = board->boardDim[i][j];
            board->boardDim[i][j] = tmp;
            }   
        }
    }
    for (i = 0; i < board->rows; i++){
    for (j = 0; j < board->cols; j++){
    printf("%c",board->boardDim[i][j]);}printf("\n");}
}

下面是完整序列的图片,程序打印一块板。要求用户选择要弹出的区域。&#39;然后,函数将替换与空格连接的所有字符。然后在图片的最后部分,您可以看到如何删除字符。没有边框的电路板就在那里,因为我用它来检查字符是否实际被删除了。 enter image description here 谢谢你提前1,阅读这整篇文章,2,你可以给予任何帮助。

2 个答案:

答案 0 :(得分:2)

由于您要将当前行与下一行进行比较,因此应使用for(i = 0; i < board->rows-1; i++) 然后在复杂的if语句中,删除&& i <= board->rows。这应该是一个小于,不是低于或等于。您已经走出界限并在阵列中获取垃圾。

答案 1 :(得分:2)

您正在检查超出最大行数的行 (board-&gt; boardDim [i + 1] [j]!= None&amp;&amp; i + 1&lt; = board-&gt; rows) 该内存不保证为0.如果它不是0,你的函数将交换它。如果它不是人类可读的,printf不会为它打印任何东西,从而转移|向左转。