C语言二维数组对角线随机方向输入单词的循环变量设置问题
实现对角线单词输入的方案
当然可行!这个需求其实很好实现,核心就是先随机敲定对角线的方向(递增/递减),然后在循环里固定首次迭代的X为0,之后按照选定的方向持续调整X的值就行。不过要留意数组越界的问题——比如选了递减方向的话,X很快会跑到负数区域,得提前做边界判断。
我给你写个完整的可运行代码示例,你可以直接参考:
#include <stdio.h> #include <stdlib.h> #include <time.h> #define ARRAY_WIDTH 10 // 二维数组的宽度(列数) #define ARRAY_HEIGHT 10 // 二维数组的高度(行数) int main() { // 初始化随机种子,只需要调用一次,放在程序开头就行 srand(time(NULL)); // 初始化二维数组,用0填充(后续打印时用.代替空字符) char grid[ARRAY_HEIGHT][ARRAY_WIDTH] = {0}; char targetWord[] = "PROGRAM"; int wordLength = sizeof(targetWord) - 1; // 去掉字符串末尾的'\0' // 随机决定对角线方向:0 = 右下对角线(X递增),1 = 左下对角线(X递减) int diagonalDir = rand() % 2; int charIndex = 0; int currentRow = 0; int currentCol = 0; // 首次迭代时X(列)固定为0 // 循环写入单词:要同时保证不超出单词长度、数组行范围、数组列范围 while (charIndex < wordLength && currentRow < ARRAY_HEIGHT && currentCol >= 0 && currentCol < ARRAY_WIDTH) { grid[currentRow][currentCol] = targetWord[charIndex]; charIndex++; currentRow++; // 不管方向,每行只写一个字符,所以行号一直递增 // 根据选定的方向调整列号 if (diagonalDir == 0) { currentCol++; } else { currentCol--; } } // 打印结果,方便验证 printf("生成的二维数组:\n"); for (int i = 0; i < ARRAY_HEIGHT; i++) { for (int j = 0; j < ARRAY_WIDTH; j++) { printf("%c ", grid[i][j] ? grid[i][j] : '.'); } printf("\n"); } return 0; }
关键细节说明:
- 随机方向生成:用
rand() % 2生成0或1,分别对应两种对角线方向。记得要先调用srand(time(NULL))初始化随机种子,不然每次运行都会得到相同的方向。 - 边界检查:循环条件里加了
currentCol >=0 && currentCol < ARRAY_WIDTH,避免数组越界导致程序崩溃。比如如果选了递减方向,第二次迭代currentCol就会变成-1,这时候循环就会停止,只会写入第一个字符。 - 迭代逻辑:首次迭代的列号(X)固定为0,之后每次循环根据方向调整列号,行号则一直递增(因为对角线是逐行向下延伸的)。
如果希望单词能完整写入数组而不被截断,你可以根据方向和单词长度调整起始列号,但如果严格要求首次迭代X必须为0,那当选择递减方向时,单词长度只能是1,否则必然会越界。你可以在代码里加个判断提示这种情况:
// 可选:提前检查递减方向下的单词长度是否合理 if (diagonalDir == 1 && wordLength > 1) { printf("注意:选择递减方向且单词长度大于1时,仅能写入第一个字符(后续列号会越界)\n"); }
内容的提问来源于stack exchange,提问作者dgnunch
相关产品推荐
相关产品推荐

