在线编译器 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("%s\n", a); printf("%s\n", b); printf("%d", result(a, b)); return 0; }
这段代码的功能是:从标准输入读取两行字符串,然后统计字符串b在字符串a中出现的次数(不重叠),最后输出原始字符串和出现次数。

代码中有一个潜在问题:`remove_newline`函数在找到换行符后立即返回,但`fgets`读取的字符串末尾可能没有换行符(例如输入长度正好等于缓冲区大小减1时),此时函数会遍历整个字符串却没有做任何修改。

- 检查`remove_newline`函数:当字符串末尾没有换行符时,它不会修改字符串,但`main`函数中仍然会打印原始字符串。这本身不是错误,但需要注意`fgets`的行为——如果输入长度超过缓冲区大小,换行符可能不会被读入。
- 检查`result`函数中的循环边界:`size_a - size_b + 1`在`size_b`为0时会导致问题,但题目中b的长度至少为1,所以暂时安全。不过当`size_a`和`size_b`都很大时,这个计算是合理的。