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

C语言中如何提取字符数组末尾子串并与另一字符数组比较?

解决字符串末尾匹配问题

你之前直接固定偏移量的写法会触发段错误,核心原因是当Object->Name长度不足时,Object->Name + 10会访问字符串边界外的非法内存。下面是安全且灵活的解决方案:

实现思路

  1. 避免硬编码长度:先获取目标类型字符串的实际长度(比如"TypeA"的长度是5),后续修改类型字符串时无需同步调整数值。
  2. 先做长度校验:计算Object->Name的长度,只有当它大于等于目标类型长度时,才进行末尾匹配,避免越界访问。
  3. 定位末尾起始点:从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 12:45:36