在线编译器 C

#include <stdio.h> int main() { char a[1001], b[1001]; scanf("%[^\n]", a); scanf("%[^\n]", b); long long int p1 = 0,p2 = 0; while(a[p1] != '\0' ) { p1++; } while(b[p2] != '\0' ) { p2++; } long long int count = 0, count1 = 0; for(int i = 0; i < p1 - p2 +1; i++) { int k = 0; count1 = 0; for(int j = i; j < i + p2;j++) { if(a[j] == b[k]) { count1++; } k++; } if(count1 == p2) { count++; } } printf("%lld", count); return 0; }
这段代码的功能是:读取两行字符串,然后统计第一行字符串中出现了多少次第二行字符串(作为连续子串)。

代码的主要逻辑是:
1. 读取两行字符串到数组 a 和 b
2. 分别计算两个字符串的长度 p1 和 p2
3. 用嵌套循环遍历 a 中所有长度为 p2 的子串,与 b 逐字符比较
4. 如果完全匹配则计数加一

代码存在一个关键问题:

- 第二个 scanf 读取时,由于第一个 scanf 读取后输入缓冲区中可能残留换行符,导致第二个字符串无法正确读取。scanf("%[^\n]") 不会跳过开头的空白字符,所以第二个 scanf 会直接遇到换行符而读取失败。

- 另外,当 p1 < p2 时,外层循环条件 i < p1 - p2 + 1 会变成负数,导致循环行为异常。