Online Compiler C

#include <stdio.h> int length(char s[]) { int i = 0; while (s[i] != '\0') { i++; } return i; } int counter(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("%[^\n]", a); scanf("%[^\n]", b); printf("%d", counter(a, b)); return 0; }
这段代码的功能是统计字符串 b 在字符串 a 中出现的次数。它先计算两个字符串的长度,然后遍历 a 的每个可能起始位置,检查从该位置开始的子串是否与 b 完全匹配。

代码存在一个输入读取的问题。当第一个 scanf 读取完第一行后,输入缓冲区中会留下一个换行符,导致第二个 scanf 无法正确读取第二行内容。

- 第一个 scanf 使用 %[^\n] 读取直到换行符,但换行符本身没有被消耗,会留在缓冲区中。
- 第二个 scanf 同样使用 %[^\n],但遇到缓冲区开头的换行符会立即停止,导致 b 数组读取为空字符串。