首页 > 解决方案 > 切片变长字符数组

问题描述

我有一个可变字符串,我需要将其分割成较小的字符串,主字符串应视为具有一定宽度和高度 MxM 的二维数组,较小的字符串应切成 NxN 大小的块。所以举个例子,如果我有下面的字符串,char source[17] = "ABCDEFGHIJKLMNS0"他的二维大小是4x4,小块的大小是2x2,那么小块应该是ABEF, CDGH, IJMN, KLSO.

换句话说,字符串应该被视为

ABCD
EFGH
IJKL
MNSO

并且 NxN 应该从中删除,例如:

AB
EF

始终限制这些块应该是线性数组作为主字符串。

我已经尝试使用以下代码嵌套 3 个,但我不知道如何计算主数组的索引以便以这种方式切割块

#include <stdlib.h>
#include <stdio.h>
#include <string.h>


int main()
{
    char pixelsSource[17] = "ABCDEFGHIJKLMNS0";
    char pixelsTarget[4][5];

    int Y = 0;
    int X = 0;
    for (int block = 0; block < 4; block++)
    {
        for (int i = 0; i < 2; i++)
        {
            for (int j = 0; j < 2; j++)
            {
                pixelsTarget[block][(i * 2) + j] = pixelsSource[(i * 2) + j];
                printf("[%d][%d] = [%d] \n", block, (i * 2) + j, (i * 2));
            }
        }
    }

    for (int block = 0; block < 4; block++)
    {
        printf("%s\n", pixelsTarget[block]);
    }
}
 

标签: arrayscstringslice

解决方案


我将其分解为更分段的方式,并将其概括为M& N。这是带有内联注释的代码:

#include <stdio.h>

#define M 4
#define N 2

int main(void)
{
    // source data is an M * M string(plus null terminator)
    char pixelsSource[M * M + 1] = "ABCDEFGHIJKLMNSO";

    // destination is an array of N*N strings; there are M*M/N*N of them
    char pixelsTarget[(M*M)/(N*N)][N*N + 1];

    // iterate over the source array; blockX and blockY are the coordinate of the top-left corner
    // of the sub-block to be extracted
    for (int blockX = 0; blockX < M; blockX += N)
    {
        for (int blockY = 0; blockY < M; blockY += N)
        {
            int dstWord = blockX/N + blockY;

            // for each letter in the sub-block, copy that letter over to the destination array
            for (int y = 0; y < N; y++)
            {
                for (int x = 0; x < N; x++)
                {
                    int dstIndex = y*N + x;
                    int srcIndex = (blockY + y)*M + blockX + x;
                    printf("[%d][%d] = [%d]\n", dstWord, dstIndex, srcIndex);
                    pixelsTarget[dstWord][dstIndex] = pixelsSource[srcIndex];
                }
            }

            // null-terminate destination word
            pixelsTarget[dstWord][N*N] = '\0';
        }
    }

    // output
    for (int block = 0; block < (M * M) / (N * N); block++)
    {
        printf("%s\n", pixelsTarget[block]);
    }
}

推荐阅读