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

字符串中子串出现次数统计程序无输出问题求助

问题分析与修复方案

你的程序无输出且功能异常,主要由几个致命错误导致,逐一拆解并修复:

1. 函数名不匹配(直接导致程序无法正常运行)

你定义的函数是aufgabe7,但main函数里调用的是task7,这会触发编译/链接错误,程序根本无法执行到输出逻辑。必须将调用改为对应函数名,同时为子串单独分配数组。

2. 缓冲区重叠(覆盖输入数据)

main里将同一个data数组同时传给string和stringw,当用fgets输入子串时,会直接覆盖之前输入的文本内容,后续匹配逻辑完全基于错误数据,甚至可能引发内存问题。需要为文本和子串分别定义独立数组。

3. fgets读取换行符导致匹配失败

fgets会把用户输入时的换行符\n也读取到字符串末尾,strlen会将其计入长度。比如输入子串llo,实际stringw存储的是"llo\n",而文本里的llo后无换行符,永远无法匹配成功。需要手动去掉字符串末尾的换行符。

4. 循环匹配逻辑缺陷

当前循环在部分匹配失败时,i直接自增会跳过可能的匹配位置。比如文本是"aaaa"、子串是"aa"时,当前逻辑只能统计1次,正确应为2次(若支持重叠匹配)。需调整i的移动逻辑:部分匹配失败时,i应回到i - count + 1,而非直接i++。

5. 未定义MAX宏

代码中使用了MAX但未定义,编译会报错,需先通过#define MAX 1024这类语句定义缓冲区大小。

6. main函数不符合C标准

C标准规定main函数必须返回int类型,void main是非标准写法,建议改为int main(void)并在末尾返回0。


修正后的完整代码

#include <stdio.h>
#include <string.h>

#define MAX 1024  // 定义缓冲区大小

void aufgabe7(char string[MAX], char stringw[MAX]){
    printf("Enter a Text: ");
    fgets(string, MAX, stdin);
    // 去掉文本末尾的换行符
    size_t len = strlen(string);
    if (len > 0 && string[len - 1] == '\n') {
        string[len - 1] = '\0';
        len--;
    }
    
    printf("Enter a string: ");
    fgets(stringw, MAX, stdin);
    // 去掉子串末尾的换行符
    size_t len2 = strlen(stringw);
    if (len2 > 0 && stringw[len2 - 1] == '\n') {
        stringw[len2 - 1] = '\0';
        len2--;
    }

    // 处理子串为空的边界情况
    if (len2 == 0) {
        printf("Empty substring, count is 0\n");
        return;
    }

    int count2 = 0;
    for (int i = 0; i <= len - len2;) {  // 优化循环边界,避免无效遍历
        int j = 0;
        while (j < len2 && string[i + j] == stringw[j]) {
            j++;
        }
        if (j == len2) {
            count2++;
            i += len2;  // 不需要重叠匹配则跳过整个子串;需要重叠则改为i++
        } else {
            i++;
        }
    }
    
    printf("%s occurs %d times in %s\n", stringw, count2, string);
}

int main(void){
    char text[MAX];
    char substring[MAX];
    aufgabe7(text, substring);
    return 0;
}

测试示例

输入:

Enter a Text: Hello World
Enter a string: llo

输出:

llo occurs 1 times in Hello World

输入重叠匹配场景(将i += len2改为i++):

Enter a Text: aaaaa
Enter a string: aa

输出:

aa occurs 4 times in aaaaa

内容的提问来源于stack exchange,提问作者xDMG126

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 12:35:26