C语言如何统计二维char数组中指定字符的出现次数
问题分析与修正方案
原代码核心错误点
- 循环边界错误:
i<=ROWS、j<=COLS会导致数组下标越界,C语言数组下标从0开始,最大有效值为ROWS-1、COLS-1,应该用<而非<= - 数组访问逻辑错误:判断条件中写的是
d[ROWS][COLS],属于固定访问越界地址,没有遍历到每个数组元素,正确写法为d[i][j] - 类型匹配错误:数组中存储的是整数2,不是字符
'2'(ASCII码为50),二者值不相等,无法正确匹配 - 代码执行顺序错误:
printf语句放在return之后,永远不会被执行 - 函数参数设计不合理:
i、j是循环变量,res是统计结果,不需要作为入参传入,同时缺少指定统计目标值的入参,灵活性差 - 未定义宏常量:
ROWS、COLS使用前需要先定义,否则编译器无法识别
修正后完整代码
#include <stdio.h> // 定义数组维度 #define ROWS 8 #define COLS 8 char d[ROWS][COLS] = { {0, 2, 0, 2, 0, 2, 0, 2}, {2, 0, 2, 0, 2, 0, 2, 0}, {0, 2, 0, 2, 0, 2, 0, 2}, {1, 0, 1, 0, 1, 0, 1, 0}, {0, 1, 0, 1, 0, 1, 0, 1}, {3, 0, 3, 0, 3, 0, 3, 0}, {0, 3, 0, 3, 0, 3, 0, 3}, {3, 0, 3, 0, 3, 0, 3, 0}}; // 参数说明:d为目标数组,target为要统计的数值 int countOccurrences(char d[ROWS][COLS], int target) { int res = 0; for (int i=0; i<ROWS; i++){ for(int j=0; j<COLS; j++){ if (target == d[i][j]) res++; } } printf("score: %d\n", res); return res; } // 测试用主函数 int main() { // 示例:统计数值2的出现次数 countOccurrences(d, 2); return 0; }
修正说明
- 新增了
ROWS、COLS宏定义,值为8匹配你的8*8数组 - 优化了函数参数,仅保留数组和要统计的目标值两个入参,循环变量、统计结果改为函数内局部变量
- 修正了循环边界和数组访问逻辑,正确遍历每个数组元素
- 调整了
printf和return的顺序,保证统计结果可以正常打印 - 支持自定义统计目标值,传入不同数值即可统计对应值的出现次数,示例中统计2的次数运行结果为12
内容的提问来源于stack exchange,提问作者Hazel Hochmann
相关产品推荐
相关产品推荐

