在线编译器 C

#include <stdio.h> #include <string.h> int main() { char text[1005]; char pattern[105]; if (fgets(text, sizeof(text), stdin) == NULL) { return 0; } int len = strlen(text); while (len > 0 && (text[len - 1] == '\n' || text[len - 1] == '\r')) { text[len - 1] = '\0'; len--; } if (fgets(pattern, sizeof(pattern), stdin) == NULL) { return 0; } len = strlen(pattern); while (len > 0 && (pattern[len - 1] == '\n' || pattern[len - 1] == '\r')) { pattern[len - 1] = '\0'; len--; } int text_len = strlen(text); int pat_len = strlen(pattern); int count = 0; if (pat_len > 0 && text_len >= pat_len) { for (int i = 0; i <= text_len - pat_len; i++) { if (strncmp(&text[i], pattern, pat_len) == 0) { count++; } } } printf("%d\n", count); return 0; }
这段代码的功能是:从标准输入读取两行字符串,第一行是文本,第二行是模式串,然后统计模式串在文本中出现的次数(不重叠的匹配),最后输出次数。

代码整体思路正确,但有一个常见的边界情况没有处理。

- 当模式串长度大于文本长度时,你的代码已经通过 `text_len >= pat_len` 条件避免了循环,这是正确的。
- 但你没有考虑模式串为空的情况。当模式串为空时,你的代码会直接输出0,但通常空模式串应该被视为出现0次,或者在某些定义下需要特殊处理。你需要确认题目对空模式串的要求。
- 另外,你的循环中 `strncmp` 比较的是从 `text[i]` 开始的 `pat_len` 个字符,这实现了滑动窗口匹配,逻辑正确。但注意,如果模式串中有空格,你的 `fgets` 会正确读取,没有问题。