如何用C语言将含81字符加终止符的一维数组转为9×9二维字符数组
实现方案
一维字符数组转9x9二维网格的核心逻辑是利用坐标映射:一维数组下标i对应二维网格的第i / 9行、第i % 9列,刚好覆盖全部81个有效字符。
1. 函数实现(两种可选写法)
写法1:全局二维数组版本
如果你的converted2d已经提前定义为全局9x9字符数组,直接用如下实现:
char converted2d[9][9]; // 全局二维网格定义 void convertArray(char lineHolder[]) { // 逐行逐列填充 for(int row = 0; row < 9; row++){ for(int col = 0; col < 9; col++){ converted2d[row][col] = lineHolder[row * 9 + col]; } } }
写法2:传参版本(更规范,避免全局变量)
推荐用传参的方式传入二维数组,代码耦合度更低:
// 函数参数接受9x9的二维数组指针 void convertArray(char lineHolder[], char converted2d[9][9]) { // 单循环实现,逻辑更简洁 for(int i = 0; i < 81; i++){ converted2d[i/9][i%9] = lineHolder[i]; } }
2. 修复原有drag函数的边界问题
原有代码没有做输入长度限制,容易出现数组越界,修改后如下:
int drag(){ char lineHolder[82]; int puzzle = SOLVABLE; int last, i; last = i = 0; // 加长度判断,最多读81个有效字符 while ((last = getchar()) != EOF && i < 81) { putchar(last); lineHolder[i] = last; i++; } lineHolder[i] = '\0'; // 手动补空终止符 // 调用转换函数 convertArray(lineHolder); // 全局版本用这行 // 传参版本用这行:convertArray(lineHolder, converted2d); return 0; }
如果你的网格后续需要按字符串处理,记得在每行末尾预留位置添加空终止符,单纯存字符网格不需要额外操作。
内容的提问来源于stack exchange,提问作者PillCosby
相关产品推荐
相关产品推荐

