Online Compiler C

#include <stdio.h> int main() { char a[1001] ;//= "aaa\n" char b[1001] ;//= "aa\n"; fgets(a, 1001, stdin); //"aaa\n" fgets(b, 1001, stdin); //"aa\n" long long int p1 = 0,p2 = 0; while(a[p1] != '\n' ) { p1++; } while(b[p2] != '\n' ) { p2++; } printf("%lld %lld\n", p1,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; }
这段代码的功能是:从标准输入读取两行字符串,分别存储在数组a和b中,然后统计字符串b在字符串a中出现的次数(连续子串匹配)。

代码首先通过循环找到两个字符串的长度(遇到换行符停止),然后使用嵌套循环进行子串匹配:外层循环遍历a中所有可能的起始位置,内层循环比较从该位置开始的连续字符是否与b完全一致。

代码中存在一个潜在问题:当p1 - p2 + 1可能为负数时,外层循环的条件会导致问题。如果b比a长,这个表达式会是负数,但循环变量i从0开始,循环条件可能意外成立。

- 检查当p2大于p1时,外层循环的边界条件是否合理。考虑一下如果b比a长,程序应该输出什么结果。
- 注意fgets会读取换行符,但你的长度计算已经排除了换行符。不过当输入为空行时,数组第一个字符就是换行符,此时p1或p2会为0,需要确认这种情况下的循环行为。