压缩每一行数组

时间:2017-10-07 06:11:19

标签: c arrays compression

我有一个函数compress2d(),它将二进制数据的二维数组(10x10)作为输入,通过用0或1替换0或1的每次运行来压缩数组的每一行,并且它发生的次数,并在每一行上打印压缩的结果。例如,具有数据0011100011的行可以被压缩为02130312。

例如:

输入:

1 1 1 1 1 0 0 0 0 0
0 0 0 0 0 1 1 1 1 1
1 1 1 1 1 0 0 0 0 0 
0 0 0 0 0 1 1 1 1 1 
1 1 1 1 1 0 0 0 0 0 
0 0 0 0 0 1 1 1 1 1 
1 1 1 1 1 0 0 0 0 0 
0 0 0 0 0 1 1 1 1 1 
1 1 1 1 1 0 0 0 0 0 
0 0 0 0 0 1 1 1 1 1 

期望的输出:

1 5 0 5  
0 5 1 5  
1 5 0 5  
0 5 1 5  
1 5 0 5  
0 5 1 5  
1 5 0 5  
0 5 1 5  
1 5 0 5  
0 5 1 5 

但我得到了:

1 5
1 4
1 4
1 4
.
.
.
.
1 4

这是我的代码:

  void compress2D(int data[SIZE][SIZE])
  {

    int i,j=0, target, count=1, location=1;
    for (i = 0; i < SIZE; i++) {
        for (j = 0; j < SIZE; j++) {
            if (data[i][j] == data[i][j+1] && (j+1) < 10)
                count++;
            else {
                data[i][location] = count;
                data[i][location+1] = data[i][j+1];
                count = 1;
                location +=2;
            }
        }

        data[i][location] = '\0';
        location = 1;
        count = 0;
    }
    for (i = 0; i < SIZE;i++) {
        for (j = 0; data[i][j] != '\0'; j++) {
            printf("%d ", data[i][j]);
        }
        printf("\n");
    }
}

1 个答案:

答案 0 :(得分:0)

'\0'与0相同。您永远不会在压缩数组中看到0值,因为打印循环在data[i][j] == '\0'时停止,与data[i][j] == 0相同。您需要使用压缩数据中可能不存在的值来表示行的结尾。您可以使用SIZE+1,因为最大可能的运行是SIZE个相同值的副本。

所以改变:

data[i][location] = '\0';

为:

data[i][location] = SIZE+1;

并改变:

for (j = 0; data[i][j] != '\0'; j++)

为:

for (j = 0; data[i][j] != SIZE+1; j++)