Онлайн компилятор 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 && size_b != 0) { 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[1001]; fgets(a, 1001, stdin); fgets(b, 101, stdin); remove_newline(a); remove_newline(b); printf("%d", result(a, b)); return 0; }
这段代码的功能是:从标准输入读取两行字符串,然后统计第二行字符串(模式串)在第一行字符串(主串)中出现的次数(不重叠计数)。代码中自己实现了字符串长度计算函数 `length` 和子串匹配计数函数 `result`。

- 在 `main` 函数中,`fgets` 读取字符串时会包含换行符,所以用 `remove_newline` 函数将其替换为字符串结束符 `\0`。
- `result` 函数通过双重循环遍历主串的每个可能起始位置,检查是否与模式串完全匹配,匹配成功则计数器加一。

代码存在一个潜在问题:`fgets(b, 101, stdin)` 限制了模式串最大长度为100,但主串长度限制为1000。如果模式串长度超过100,读取会被截断,可能导致逻辑错误。

- 检查 `fgets` 的第二个参数是否与数组大小匹配。`b` 数组大小为1001,但 `fgets` 只允许读取最多100个字符(加上 `\0` 共101),这可能导致输入较长模式串时被意外截断。
- 考虑如果模式串长度大于主串长度的情况,`result` 函数中的条件 `size_a >= size_b` 已经处理了这种情况,但 `size_b != 0` 的条件可以思考是否必要。