问题中的代码无法编译,并且似乎显示出各种误解。例如:
char array[8][7] = {['a','b','c','d','e','f','g','h']
['q','w','e','r','t','y','u','i']
['k','j','h','g','f','d','s','a']
['z','x','c','v','b','n','m','q']
['g','z','p','l','k','h','n','a']
['q','e','m','a','c','t','u','p']
['r','b','l','t','k','f','b','z']}
方括号应该是大括号,右括号后面应该跟逗号。定义的末尾需要有一个分号。有7行数据,每行8个元素,所以数组维度应该是array[7][8]。问题文本提到了一个 8x10 数组;它没有显示出来。
问题还说(或多或少)“我想打印一个 5x5 数组,数组的中心是'm'(元素array[6][3])”——但是有一个@ 987654325@array[3][6] 和另一个array[6][2]。对于这两个位置,以这些位置为中心的 5x5 阵列在阵列边界之外运行。代码应避免此类访问。
C99 及更高版本支持可变长度数组(在 C99 中无条件;在 C11 或 C17 中有条件)。除非您遇到不支持它的编译器,否则应该在现代代码中使用它。主要基于 Unix 的桌面系统上的编译器确实支持它们(GCC、Clang 等)。
下面是一些似乎可以工作的代码:
/* SO 6908-1666 */
#include <stdio.h>
static void print_submatrix(int nrows, int ncols, char matrix[nrows][ncols],
int crow, int ccol, int rsize, int csize)
{
int min_row = crow - (rsize / 2);
int max_row = min_row + rsize;
int min_col = ccol - (csize / 2);
int max_col = min_col + csize;
/* Array bounds? */
if (min_col < 0)
min_col = 0;
if (min_row < 0)
min_row = 0;
if (max_col > ncols)
max_col = ncols;
if (max_row > nrows)
max_row = nrows;
printf("R = %d, C = %d, Centre (%d, %d), Size (%d, %d) ",
nrows, ncols, crow, ccol, rsize, csize);
printf("Columns [%d..%d), Rows [%d..%d)\n", min_col, max_col, min_row, max_row);
for (int i = min_row; i < max_row; i++)
{
for (int j = min_col; j < max_col; j++)
putchar(matrix[i][j]);
putchar('\n');
}
}
int main(void)
{
char array[7][8] =
{
{ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' },
{ 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i' },
{ 'k', 'j', 'h', 'g', 'f', 'd', 's', 'a' },
{ 'z', 'x', 'c', 'v', 'b', 'n', 'm', 'q' },
{ 'g', 'z', 'p', 'l', 'k', 'h', 'n', 'a' },
{ 'q', 'e', 'm', 'a', 'c', 't', 'u', 'p' },
{ 'r', 'b', 'l', 't', 'k', 'f', 'b', 'z' },
};
print_submatrix(7, 8, array, 6, 2, 5, 5);
print_submatrix(7, 8, array, 3, 6, 5, 5);
print_submatrix(7, 8, array, 3, 3, 5, 5);
/* Print whole matrix, but it isn't a good use of the interface */
print_submatrix(7, 8, array, 3, 4, 7, 8);
return 0;
}
样本输出:
R = 7, C = 8, Centre (6, 2), Size (5, 5) Columns [0..5), Rows [4..7)
gzplk
qemac
rbltk
R = 7, C = 8, Centre (3, 6), Size (5, 5) Columns [4..8), Rows [1..6)
tyui
fdsa
bnmq
khna
ctup
R = 7, C = 8, Centre (3, 3), Size (5, 5) Columns [1..6), Rows [1..6)
werty
jhgfd
xcvbn
zplkh
emact
R = 7, C = 8, Centre (3, 4), Size (7, 8) Columns [0..8), Rows [0..7)
abcdefgh
qwertyui
kjhgfdsa
zxcvbnmq
gzplkhna
qemactup
rbltkfbz