Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 切片可变长度字符数组_Arrays_C_String_Slice - Fatal编程技术网

Arrays 切片可变长度字符数组

Arrays 切片可变长度字符数组,arrays,c,string,slice,Arrays,C,String,Slice,我有一个变量字符串,我需要将其切成更小的字符串,主字符串应该被视为具有一定宽度和高度MxM的二维数组,较小的字符串应该被切成NxN大小的块。例如,如果我有以下字符串,char source[17]=“ABCDEFGHIJKLMNS0”,他的二维大小是4x4,较小的块的大小是2x2,较小的块应该是ABEF,CDGH,IJMN,KLSO 换句话说,字符串应该被视为 ABCD EFGH IJKL MNSO NxN应该从中删除,如: AB EF 始终限制这些块应为线性阵列作为主字符串 我用下面的代码

我有一个变量字符串,我需要将其切成更小的字符串,主字符串应该被视为具有一定宽度和高度MxM的二维数组,较小的字符串应该被切成NxN大小的块。例如,如果我有以下字符串,
char source[17]=“ABCDEFGHIJKLMNS0”
,他的二维大小是4x4,较小的块的大小是2x2,较小的块应该是
ABEF
CDGH
IJMN
KLSO

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

ABCD
EFGH
IJKL
MNSO
NxN应该从中删除,如:

AB
EF
始终限制这些块应为线性阵列作为主字符串

我用下面的代码尝试了3嵌套for,但我不知道如何计算主数组的索引,以便以这种方式剪切块

#包括
#包括
#包括
int main()
{
字符像素源[17]=“ABCDEFGHIJKLMNS0”;
char-pixelsTarget[4][5];
int Y=0;
int X=0;
用于(int block=0;block<4;block++)
{
对于(int i=0;i<2;i++)
{
对于(int j=0;j<2;j++)
{
pixelsTarget[block][(i*2)+j]=pixelsSource[(i*2)+j];
printf(“[%d][%d]=[%d]\n”,块,(i*2)+j,(i*2));
}
}
}
用于(int block=0;block<4;block++)
{
printf(“%s\n”,pixelsTarget[block]);
}
}

我将其分解为一个更为详细的部分,并将其推广到
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]);
    }
}
#包括
#定义M4
#定义n2
内部主(空)
{
//源数据是一个M*M字符串(加上空终止符)
字符像素源[M*M+1]=“ABCDEFGHIJKLMNSO”;
//目标是N*N个字符串的数组;其中有M*M/N*N个字符串
char-pixelsTarget[(M*M)/(N*N)][N*N+1];
//迭代源数组;blockX和blockY是左上角的坐标
//要提取的子块的名称
对于(int blockX=0;blockX
X和Y用于什么?删除它们?