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

#include <stdio.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; } int main() { char a[1001]; char b[101]; scanf("%s", a); scanf("%s", b); printf("%d", result(a, b)); return 0; }
这段代码的功能是:输入两个字符串 a 和 b,统计字符串 b 在字符串 a 中作为连续子串出现的次数。代码通过两层循环遍历 a 中所有可能的起始位置,检查从该位置开始的子串是否与 b 完全匹配。

- 在 result 函数中,外层循环的边界条件 `size_a - size_b + 1` 是正确的,但内层循环中判断匹配的方式存在一个逻辑问题:当发现某个字符不匹配时,程序仍然会继续累加 sum,这会导致错误计数。你应该在内层循环中,一旦发现字符不匹配就立即停止当前子串的检查,而不是继续累加。
- 另外,注意 scanf 读取字符串时,如果输入中包含空格或换行符,可能会影响读取结果。但根据题目要求,这里可能只需要处理连续的非空格字符。