You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 11:05:26