Unix环境下不使用<string.h>库检查字符数组是否含指定序列
嘿,我来帮你搞定这个contains函数的实现问题!先拆解下你现有代码里的核心问题,再一步步梳理正确的实现思路~
问题分析:现有代码的关键bug
- 首先,
sizeof(Array)和sizeof(Sequence)完全用错了!当你把字符串指针传给函数时,sizeof拿到的是指针本身的内存大小(比如64位系统是8字节),根本不是字符串的实际长度,这会导致循环范围完全错误。 - 内层循环的字符比较逻辑也有问题:你写的
Array[i] == Sequence[i]应该是Array[i+s] == Sequence[s],而且不能只对比单个字符,要连续匹配整个目标序列才行。
实现思路
我给你梳理清晰的分步逻辑:
- 先处理边界情况:如果目标序列是空字符串,直接返回
true(按惯例空串被所有字符串包含);如果原数组为空但序列非空,直接返回false。 - 手动实现字符串长度计算:因为不能用
<string.h>,所以自己写个小逻辑,遍历字符串直到遇到结束符'\0'来获取长度。 - 控制外层循环的起始范围:原数组的起始匹配位置最多到
原数组长度 - 目标序列长度,超过这个位置就不可能容纳完整的目标序列了,不用再循环。 - 内层循环逐字符匹配:从当前起始位置开始,逐个对比原数组和目标序列的字符,如果全部匹配成功,直接返回
true;中途有不匹配的就跳出内层循环,尝试下一个起始位置。 - 遍历完所有可能仍无匹配:返回
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
相关产品推荐
相关产品推荐

