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[1001]; int i1 = 0, i2 = 0; char c; while (i1 < 1000 && (c = getchar()) != '\n') { a[i1] = c; i1++; } a[i1] = '\0'; while (i2 < 100 && (c = getchar()) != '\n') { b[i2] = c; i2++; } b[i2] = '\0'; printf("%s\n", a); printf("%s\n", b); printf("%d", result(a, b)); return 0; }
这段代码的功能是:从输入中读取两行字符串,然后统计第二行字符串(模式串)在第一行字符串(主串)中出现的次数(不重叠的匹配次数)。代码中自己实现了字符串长度函数 `length` 和模式匹配计数函数 `result`。

代码存在一个关键问题:在 `main` 函数中读取字符串时,第二个 `while` 循环的条件是 `i2 < 100`,但数组 `b` 的大小是 `1001`,这里限制了最多只能读取 100 个字符,而题目可能要求更长的模式串。另外,读取方式没有处理输入中的换行符残留问题,可能导致第二个字符串读取不正确。

- 检查第二个 `while` 循环的边界条件 `i2 < 100`,思考这个限制是否与题目要求一致,以及数组 `b` 的实际可用空间。
- 注意在读取第一个字符串后,输入缓冲区中可能还有换行符,这会影响第二个字符串的读取。观察 `getchar()` 的调用顺序,确认是否正确地跳过了换行符。