在线编译器 C

#include <stdio.h> int main() { char a[1001] = "aaa\0"; char b[101] = "aa\0"; fgets(a, 1001, stdin); //"aaa\n" fgets(b, 101, stdin); //"aa\n" long long int p1 = 0,p2 = 0; while(a[p1] != '\0' ) { p1++; } while(b[p2] != '\0' ) { p2++; } //printf("%lld %lld\n", p1,p2); long long int count = 0, count1 = 0; for(int i = 0; i < p1 - p2; 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 作为子串。但代码中存在一些逻辑问题。

主要问题在于循环的范围和比较方式。外层循环 `for(int i = 0; i < p1 - p2; i++)` 的条件是 `i < p1 - p2`,这会导致漏掉最后一次可能的匹配位置。例如,如果 a 的长度是 5,b 的长度是 2,那么 i 应该从 0 到 3(即 p1 - p2),但你的循环条件 `i < p1 - p2` 只执行到 i=2,漏掉了 i=3 的情况。

- 提示1:检查外层循环的终止条件。当 i 等于 p1 - p2 时,是否还有可能匹配?考虑一下当 a 和 b 长度相等时的情况。
- 提示2:注意 fgets 会读取换行符 `\n` 并存入字符串中。你的字符串 a 和 b 可能包含换行符,这会影响比较结果。思考一下是否需要处理这个换行符。