C程序输出异常:判断句子中单词存在性功能失效求助
问题排查与修复
核心问题分析
1. 匹配逻辑缺陷
原函数s仅在单词起始位置(初始k==1或前一个字符是空格)时触发字符比较,但匹配过程中,后续字符的位置既不满足单词起始条件,也没有延续匹配的逻辑,导致匹配到搜索词的第一个字符后,i无法继续递增,永远达不到搜索词的长度,因此无法返回true。
比如搜索"name"时:
- 当
sen指向'n'(单词起始位置),i递增到1; - 后续
sen移动到'a'、'm'、'e'时,因不满足单词起始条件,不会进入匹配判断,i始终停留在1,永远触发不了匹配成功的逻辑。
2. fgets的换行符问题
fgets会将输入时的换行符\n存入sen数组,若搜索最后一个单词(比如"is"),匹配到末尾字符时,sen+1是\n,不满足*(sen+1)==' ' || *(sen+1)=='\0'的判断条件,同样会返回"未找到"。
修复后的代码
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <stdbool.h> bool s(char *sen, char *search) { int i = 0; int search_len = strlen(search); // 空搜索词直接返回false if (search_len == 0) return false; while (*sen != '\0') { // 正在匹配过程中,或当前是单词起始位置 if (i > 0 || (sen == search || *(sen - 1) == ' ')) { if (*sen == search[i]) { i++; // 完全匹配搜索词,检查后续是否为单词边界 if (i == search_len) { if (*(sen + 1) == ' ' || *(sen + 1) == '\0') { return true; } else { // 不是完整单词,重置匹配状态 i = 0; } } } else { // 匹配失败,重置状态 i = 0; } } sen++; } return false; } int main() { char sen[100], search[20]; fgets(sen, 100, stdin); // 移除fgets读取的换行符 sen[strcspn(sen, "\n")] = '\0'; scanf("%s", search); if (s(sen, search)) { printf("Found"); } else { printf("Not found"); } return 0; }
修复说明
- 匹配逻辑优化:增加了
i>0的判断,确保匹配过程中后续字符能持续参与比较,直到完成完整匹配或匹配失败; - 换行符处理:用
strcspn移除fgets读取的换行符,避免影响单词边界判断; - 规范修正:将
void main改为标准的int main,符合C语言规范。
内容的提问来源于stack exchange,提问作者Dhruv
相关产品推荐
相关产品推荐

