Online Compiler 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, 1001, stdin); remove_newline(a); remove_newline(b); printf("%d", result(a, b)); return 0; }
这段代码的功能是:从标准输入读取两行字符串,然后统计第二个字符串在第一个字符串中作为连续子串出现的次数(不重叠计数),最后输出这个次数。

代码中有一个明显的错误:在 `main` 函数中,读取第二个字符串时使用了 `fgets(b, 1001, stdin)`,但 `b` 数组的大小只有 101,这会导致缓冲区溢出,可能造成程序崩溃或未定义行为。

- 检查 `fgets` 调用中第二个参数的大小是否与数组的实际容量匹配。`b` 数组只有 101 个元素,但这里传入了 1001,应该改为 `sizeof(b)` 或 101。
- 另外,`result` 函数中的循环条件 `i < size_a - size_b + 1` 在 `size_b` 为 0 时会有问题,但题目中字符串通常非空,可以暂时忽略。