切片变长字符数组
Slice variable length char array
我有一个可变字符串,我需要将其切成更小的字符串,主字符串应被视为具有一定宽度和高度 MxM 的二维数组,而较小的字符串应被切成 NxN 大小的块.因此,例如,如果我有以下字符串 char source[17] = "ABCDEFGHIJKLMNS0"
并且他的二维大小为 4x4,并且较小块的大小为 2x2,则较小块应为 ABEF
、CDGH
, IJMN
, KLSO
.
换句话说,字符串应该被视为
ABCD
EFGH
IJKL
MNSO
并且 NxN 应该从中删除,例如:
AB
EF
总是有这些块应该是线性数组作为主要字符串的约束。
我尝试使用 3 个嵌套 for,使用以下代码,但我不知道如何计算主数组的索引以便以这种方式切割块
#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]);
}
}
我将其分解为更具体的方式,并将其概括为 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] = '[=10=]';
}
}
// output
for (int block = 0; block < (M * M) / (N * N); block++)
{
printf("%s\n", pixelsTarget[block]);
}
}
我有一个可变字符串,我需要将其切成更小的字符串,主字符串应被视为具有一定宽度和高度 MxM 的二维数组,而较小的字符串应被切成 NxN 大小的块.因此,例如,如果我有以下字符串 char source[17] = "ABCDEFGHIJKLMNS0"
并且他的二维大小为 4x4,并且较小块的大小为 2x2,则较小块应为 ABEF
、CDGH
, IJMN
, KLSO
.
换句话说,字符串应该被视为
ABCD
EFGH
IJKL
MNSO
并且 NxN 应该从中删除,例如:
AB
EF
总是有这些块应该是线性数组作为主要字符串的约束。
我尝试使用 3 个嵌套 for,使用以下代码,但我不知道如何计算主数组的索引以便以这种方式切割块
#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]);
}
}
我将其分解为更具体的方式,并将其概括为 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] = '[=10=]';
}
}
// output
for (int block = 0; block < (M * M) / (N * N); block++)
{
printf("%s\n", pixelsTarget[block]);
}
}