C 压缩字符数据

C 压缩字符数据,c,compression,C,Compression,我有一个5 x 10char矩阵,我想把它压缩成一个游程编码 printf("Enter your data (5x10) of characters: \n"); for (i = 0; i < SIZE1; i++) for (j = 0; j < SIZE2; j++) scanf("%c", &matrix2[i][j]); printf("\n"); compress(matrix2); break;

我有一个5 x 10
char
矩阵,我想把它压缩成一个游程编码

    printf("Enter your data (5x10) of characters: \n");
    for (i = 0; i < SIZE1; i++)
    for (j = 0; j < SIZE2; j++)
        scanf("%c", &matrix2[i][j]);
    printf("\n");
    compress(matrix2);
    break;  

void compress(char data[SIZE1][SIZE2])
{
    int row, column, count=1;
    for (row = 0; row < SIZE1; row++)
    {
        for (column = 0; column < SIZE2; column++)
        {
            if (data[row][column] == data[row][column + 1])
            {
                count++;
            }
            else
            {
                printf("%c%d", data[row][column], count);
                count = 1;
            }
        }
    }
}
输出:

a3b3c3d1
1a2b2c2d2e2
1a10
1a1b1c1a1b1c1a1b1c1a1
1a3b3
预期产出:

a3b3c3d1
a2b2c2d2e2
a10
a1b1c1a1b1c1a1b1c1a1
a3b3c4

这也算上了换行符。

我相信评论者建议这样做:

    printf("Enter your data (5x10) of characters: \n");
    for (i = 0; i < SIZE1; i++)
    for (j = 0; j < SIZE2; j++)
        scanf("%c", &matrix2[i][j]);
    printf("\n");
    compress(matrix2);
    break;  

void compress(char data[SIZE1][SIZE2])
{
    int row, column, count=1;
    for (row = 0; row < SIZE1; row++)
    {
        for (column = 0; column < SIZE2; column++)
        {
            if (data[row][column] == data[row][column + 1])
            {
                count++;
            }
            else
            {
                if (data[row][column] != '\n')
                {
                    printf("%c%d", data[row][column], count);
                    count = 1;
                }
            }
        }
    }
}
printf(“输入字符的数据(5x10):\n”);
对于(i=0;i
更改数据输入。让它处理
\n
和错误检测

printf("Enter your data (%dx%d) of characters: \n", SIZE1, SIZE2);
for (i = 0; i < SIZE1; i++) {
  char buffer[(SIZE2 + 2)*2];  // Consider IO buffers 2x the needed size
  if (fgets(buffer, sizeof buffer, stdin) == NULL) 
    Handle_EndOfFileOrIOError();

  size_t len = strlen(buffer);
  if (len != SIZE2+1 || buffer[len-1] != '\n') 
    Handle_UnexpectDataLengthError(buffer, len);

  for (j = 0; j < SIZE2; j++) {
    matrix2[i][j] = buffer[j];
  }
  // or simply memcpy(matrix2[i], buffer, SIZE2);

printf("\n");
compress(matrix2);
break;  
printf(“输入字符的数据(%dx%d):\n”、大小1、大小2);
对于(i=0;i
1前面有一个新行字符(
\n
)。因此..我认为您没有使用
fgets()
当从输入中读取这些并剥离尾随换行符时?不,这只是一个普通的scanf函数,用于读取矩阵并压缩数据。如何删除换行符?在我看来,此代码不起作用,因为函数不会获得SIZE1和SIZE2;因为函数接收到指向数组第一个元素的指针。
data[row][column+1]
可能正在检查由于循环限制可能不应该检查的内容…OP编辑了输入。现在它正在计算换行:)。因为我是编程新手,而且还没有学习缓冲区,有没有办法检测“\n”并阻止它进入数组?因为问题是“\n”在数组中被考虑,我的最后4个数字没有记录在数组中。
printf("Enter your data (%dx%d) of characters: \n", SIZE1, SIZE2);
for (i = 0; i < SIZE1; i++) {
  char buffer[(SIZE2 + 2)*2];  // Consider IO buffers 2x the needed size
  if (fgets(buffer, sizeof buffer, stdin) == NULL) 
    Handle_EndOfFileOrIOError();

  size_t len = strlen(buffer);
  if (len != SIZE2+1 || buffer[len-1] != '\n') 
    Handle_UnexpectDataLengthError(buffer, len);

  for (j = 0; j < SIZE2; j++) {
    matrix2[i][j] = buffer[j];
  }
  // or simply memcpy(matrix2[i], buffer, SIZE2);

printf("\n");
compress(matrix2);
break;