字符串中子串出现次数统计程序无输出问题求助
问题分析与修复方案
你的程序无输出且功能异常,主要由几个致命错误导致,逐一拆解并修复:
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
相关产品推荐
相关产品推荐

