Arrays 切片可变长度字符数组
我有一个变量字符串,我需要将其切成更小的字符串,主字符串应该被视为具有一定宽度和高度MxM的二维数组,较小的字符串应该被切成NxN大小的块。例如,如果我有以下字符串,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 始终限制这些块应为线性阵列作为主字符串 我用下面的代码
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用于什么?删除它们?