如何解决字符串字符与wordhunt结构体字母数组指针的比较类型不匹配问题?
问题描述
我正在开发一款基于iMessage平台的单词搜索游戏(通过连线网格中的字母组成单词)。目前我在遍历标准字典查找可能的单词,但卡在了字符串字符与结构体中字母数组指针的类型比较问题上,解决这个问题就能完成二维数组上的单词匹配功能。
我的字母存储在读取输入文件数据的wordhunt结构体中,输入文件示例如下:
3 3 # 字母网格的行数和列数 3 # 要查找的单词长度 t l e a u n i s h # 填充字母网格的所有字母
结构体定义如下:
typedef struct wordhunt { char** words; char** letters; int rows, cols; int numWords; int wordLen; } wordhunt_t;
目前我用wordhunt->letters[j]访问字母,但因为类型差异,没法和word[i](单词中的单个字符)比较。我试过把字母存储到结构体外部的新数组里,输入文件中的整数处理没问题,但不知道怎么处理字符和单词的转换。
相关代码片段:
// 假设word已从字典正确读取,同时在循环中遍历每个字母 if (word[i] == wordhunt->letters[j]){ // 记录单词中的每个字母是否在字母数组中,后续会用到 ++validLetterCt // 跳出循环,处理单词的下一个字母 break; }
解决方案
问题根源
你代码里的wordhunt->letters[j]是char*类型(二级指针char**解引用一次得到的是指向某一行字符的指针),而word[i]是单个char类型,两者类型不匹配,自然无法直接比较。
核心修复方法
因为letters是对应网格的二维字符数组,访问单个字母需要两次解引用:先定位到行,再定位到该行的具体列。比如要访问第j行第k列的字母,应该用wordhunt->letters[j][k],修改后的代码如下:
// 假设word已从字典正确读取,同时在循环中遍历每个字母 // 这里需要嵌套循环遍历网格的每一行每一列 for (int j = 0; j < wordhunt->rows; j++) { for (int k = 0; k < wordhunt->cols; k++) { if (word[i] == wordhunt->letters[j][k]) { ++validLetterCt; break; } } if (validLetterCt > 0) break; // 找到匹配就跳出外层循环 }
补充优化建议
如果你的需求只是先检查单词的每个字符是否存在于整个网格的字母集合中(暂不考虑位置和连线顺序),可以先把网格里的所有字符存入一个一维数组,这样遍历比较更简便:
// 先把网格所有字母存入一维数组 char* allLetters = malloc(wordhunt->rows * wordhunt->cols * sizeof(char)); int idx = 0; for (int j = 0; j < wordhunt->rows; j++) { for (int k = 0; k < wordhunt->cols; k++) { allLetters[idx++] = wordhunt->letters[j][k]; } } // 后续比较单词字符时直接遍历一维数组 for (int m = 0; m < wordhunt->rows * wordhunt->cols; m++) { if (word[i] == allLetters[m]) { ++validLetterCt; break; } }
另外要注意,初始化letters二维数组时,要确保每行都分配了足够的内存存储对应列数的字符,避免出现访问越界的问题。
内容的提问来源于stack exchange,提问作者user24095733
相关产品推荐
相关产品推荐

