Online Compiler C

#include <stdio.h> int main() { char a[1001];//= "aaaa\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++; } //p1--; while(a[p1-1]=='\n')p1--; //p1++; while(b[p2] != '\0' ) { p2++; } //p2--; while(a[p2-1]=='\n')p2--; //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完全匹配。

代码中存在几个逻辑错误,导致结果可能不正确:

- 在计算字符串b的长度时,你错误地使用了`a[p2-1]`来检查换行符,这里应该使用`b[p2-1]`。这个错误会导致p2的值被错误地修改,进而影响后续循环的范围和比较结果。

- 在去掉换行符的循环中,你只检查了最后一个字符,但fgets可能保留换行符,如果字符串本身以换行符结尾,这个处理是正确的。但要注意,如果字符串中没有换行符(例如输入长度达到限制),你的循环条件`a[p1-1]=='\n'`可能会访问到错误的位置。