You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 19:43:16