C语言递归统计字符问题:仅返回首个测试用例,求错误排查
问题分析与修正
你的代码存在几个关键错误,导致无法正确处理多测试用例及带空格的字符串:
1. 输入读取问题
scanf("%s", palavra)只能读取空格前的部分字符串,无法处理题目中包含空格的输入(比如open cadabra);同时循环读取n次时,每次都覆盖同一个palavra变量,最终palavra仅保留最后一个测试用例的内容。
2. 存储结构缺陷
仅用单个一维数组存储所有测试用例,无法保存多个输入的字符串,前面的测试用例会被后续输入覆盖。
3. 计算与输出逻辑错误
- 第二个循环中,所有
re[j]都基于最后一个测试用例的palavra计算,结果全部重复。 - 最后仅输出
re[j]时,j的值已经等于n(循环结束后j的取值),属于数组越界访问,输出的是无效值,且未循环输出所有测试用例的结果。
修正后的代码
#include <stdio.h> #include <string.h> #define MAX 5001 // 预留'\0'的位置 int ocorrencias(char palavra[], char letra, int i) { if (palavra[i] == '\0') return 0; return (letra == palavra[i]) + ocorrencias(palavra, letra, i + 1); } int main() { char palavras[MAX][MAX]; // 二维数组存储多个测试用例 char letra = 'x'; int i, n; int re[MAX]; scanf("%d", &n); getchar(); // 读取换行符,避免干扰后续fgets // 读取所有测试用例 for(i = 0; i < n; i++){ fgets(palavras[i], MAX, stdin); // 替换fgets读取的换行符为'\0' palavras[i][strcspn(palavras[i], "\n")] = '\0'; } // 逐个计算每个测试用例的结果 for(i = 0; i < n; i++){ re[i] = ocorrencias(palavras[i], letra, 0); } // 循环输出所有结果 for(i = 0; i < n; i++){ printf("%d\n", re[i]); } return 0; }
关键修改说明
- 使用二维数组
palavras[MAX][MAX]存储每个测试用例,避免覆盖。 - 改用
fgets读取整行输入,确保包含空格的字符串能被完整读取;通过strcspn替换换行符为'\0',避免字符串末尾残留换行影响统计。 - 读取
n后调用getchar(),清除输入缓冲区中的换行符,防止fgets读取到空行。 - 调整计算和输出逻辑,逐个处理每个测试用例,并循环输出所有结果。
内容的提问来源于stack exchange,提问作者Gabriel Santos
相关产品推荐
相关产品推荐

