Онлайн компилятор C

#include <stdio.h> #include <string.h> int length(char s[]) { int i = 0; while (s[i] != '\0') { i++; } return i; } int result(char a[], char b[]) { int size_a = length(a); int size_b = length(b); int counter = 0; if (size_a >= size_b) { for (int i = 0; i < size_a - size_b + 1; i++) { int sum = 0; for (int j = 0; j < size_b; j++) { if (a[i + j] == b[j]) { sum++; } } if (sum == size_b) { counter++; } } } return counter; } void remove_newline(char s[]) { int i = 0; int size = length(s); while (i < size) { if (s[i] == '\n') { s[i] = '\0'; return; } i++; } } int main() { char a[1001]; char b[101]; fgets(a, 1001, stdin); fgets(b, 101, stdin); remove_newline(a); remove_newline(b); printf("%d", result(a, b)); return 0; }
这段代码的功能是:从标准输入读取两行字符串,然后统计字符串b在字符串a中作为连续子串出现的次数(不重叠计数),最后输出这个次数。

代码中定义了几个函数:length计算字符串长度,result统计子串出现次数,remove_newline去除换行符。主函数中先读取两个字符串,去除换行符后调用result并输出结果。

- 在result函数中,外层循环的边界条件是 `i < size_a - size_b + 1`,这个条件在size_a小于size_b时不会进入循环,但你的代码已经用if判断了size_a >= size_b,所以逻辑上没问题。不过要注意,当size_b为0时(空字符串),这个条件会导致循环执行size_a+1次,但你的代码没有处理空字符串的情况,可以考虑是否需要处理。

- 你的子串匹配方法是逐个字符比较,当所有字符相等时计数器加1。这种方法是正确的,但注意它统计的是所有可能的起始位置,包括重叠的情况。例如a="aaa", b="aa",会统计到两次(位置0和位置1),这符合你的需求吗?如果题目要求不重叠计数,你的代码目前是重叠计数的。