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

Unix环境下不使用<string.h>库检查字符数组是否含指定序列

嘿,我来帮你搞定这个contains函数的实现问题!先拆解下你现有代码里的核心问题,再一步步梳理正确的实现思路~

问题分析:现有代码的关键bug
  • 首先,sizeof(Array)和sizeof(Sequence)完全用错了!当你把字符串指针传给函数时,sizeof拿到的是指针本身的内存大小(比如64位系统是8字节),根本不是字符串的实际长度,这会导致循环范围完全错误。
  • 内层循环的字符比较逻辑也有问题:你写的Array[i] == Sequence[i]应该是Array[i+s] == Sequence[s],而且不能只对比单个字符,要连续匹配整个目标序列才行。
实现思路

我给你梳理清晰的分步逻辑:

  1. 先处理边界情况:如果目标序列是空字符串,直接返回true(按惯例空串被所有字符串包含);如果原数组为空但序列非空,直接返回false。
  2. 手动实现字符串长度计算:因为不能用<string.h>,所以自己写个小逻辑,遍历字符串直到遇到结束符'\0'来获取长度。
  3. 控制外层循环的起始范围:原数组的起始匹配位置最多到原数组长度 - 目标序列长度,超过这个位置就不可能容纳完整的目标序列了,不用再循环。
  4. 内层循环逐字符匹配:从当前起始位置开始,逐个对比原数组和目标序列的字符,如果全部匹配成功,直接返回true;中途有不匹配的就跳出内层循环,尝试下一个起始位置。
  5. 遍历完所有可能仍无匹配:返回false。
完整可运行代码
#include <stdbool.h>
#include <stdio.h>

// 辅助函数:手动计算字符串长度(替代<string.h>里的strlen)
int str_length(char *str) {
    int len = 0;
    while (str[len] != '\0') {
        len++;
    }
    return len;
}

bool contains(char *Array, char *Sequence) {
    int arr_len = str_length(Array);
    int seq_len = str_length(Sequence);

    // 边界情况:空序列默认被包含
    if (seq_len == 0) {
        return true;
    }
    // 原数组比目标序列短,不可能匹配
    if (arr_len < seq_len) {
        return false;
    }

    // 遍历所有可能的起始匹配位置
    for (int i = 0; i <= arr_len - seq_len; i++) {
        bool is_match = true;
        // 逐字符对比当前起始位置的子串
        for (int s = 0; s < seq_len; s++) {
            if (Array[i + s] != Sequence[s]) {
                is_match = false;
                break;
            }
        }
        if (is_match) {
            return true;
        }
    }

    return false;
}

int main() {
    char *Arr = "ABCDEFG";
    char *Seq = "AB";
    bool contained = contains(Arr, Seq);
    if (contained) {
        printf("Contained\n");
    } else {
        printf("Not Contained\n");
    }

    // 可以多测试几个用例验证
    char *Seq2 = "EF";
    printf("%s\n", contains(Arr, Seq2) ? "Contained" : "Not Contained");
    char *Seq3 = "XYZ";
    printf("%s\n", contains(Arr, Seq3) ? "Contained" : "Not Contained");

    return 0;
}
额外建议
  • 一定要覆盖边界测试用例:比如序列在原数组开头、中间、结尾,完全不匹配,序列和原数组长度相同,空序列等。
  • 如果追求更高性能,可以了解KMP算法(一种更高效的字符串匹配算法),但对于大多数入门场景,上面的暴力匹配已经足够简单易懂。

内容的提问来源于stack exchange,提问作者AES2048

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 14:18:13