C语言中如何提取字符数组末尾子串并与另一字符数组比较?
解决字符串末尾匹配问题
你之前直接固定偏移量的写法会触发段错误,核心原因是当Object->Name长度不足时,Object->Name + 10会访问字符串边界外的非法内存。下面是安全且灵活的解决方案:
实现思路
- 避免硬编码长度:先获取目标类型字符串的实际长度(比如
"TypeA"的长度是5),后续修改类型字符串时无需同步调整数值。 - 先做长度校验:计算
Object->Name的长度,只有当它大于等于目标类型长度时,才进行末尾匹配,避免越界访问。 - 定位末尾起始点:从
Object->Name的末尾偏移目标长度的位置开始,和类型字符串做完整比较。
示例代码
#include <string.h> #include <stdio.h> // 假设Object结构体定义如下 typedef struct { char* Name; } Object; int main() { char type[] = "TypeA"; size_t type_len = strlen(type); // 测试不同场景的Object实例 Object obj_with_prefix = {"Chocolate_TypeA"}; Object obj_no_prefix = {"TypeA"}; Object obj_too_short = {"Test"}; // 处理带前缀的情况 size_t name_len = strlen(obj_with_prefix.Name); if (name_len >= type_len && strcmp(obj_with_prefix.Name + (name_len - type_len), type) == 0) { printf("带前缀的对象匹配成功!\n"); } // 处理无前缀的情况 name_len = strlen(obj_no_prefix.Name); if (name_len >= type_len && strcmp(obj_no_prefix.Name + (name_len - type_len), type) == 0) { printf("无前缀的对象匹配成功!\n"); } // 处理长度不足的情况(不会触发错误) name_len = strlen(obj_too_short.Name); if (name_len >= type_len && strcmp(obj_too_short.Name + (name_len - type_len), type) == 0) { printf("短字符串对象匹配成功!\n"); } return 0; }
注意事项
- 要确保
Object->Name不是空指针,如果存在空指针的可能,需要先添加判断:if (Object->Name == NULL) { /* 空指针处理逻辑 */ } - 使用
strcmp而非strncmp,因为我们已经通过长度校验确保了起始位置合法,strcmp会自动匹配到字符串结束符,结果更准确。
内容的提问来源于stack exchange,提问作者psychosys
相关产品推荐
相关产品推荐

