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

C语言中使用strstr()提取指定子串后内容的问题排查

问题分析与解决

你的代码存在几个关键问题,导致无法正确提取目标内容:

  1. 未跳过前缀字符串:p1指向的是"V { "的起始位置,你需要先跳过这个前缀才能定位到<Target>部分。
  2. 空指针访问风险:在调用strstr(p1, ";")前没有判断p1是否为NULL,会导致未定义行为。
  3. 未处理<>包裹的内容:直接截取到;的话会包含<>,需要进一步提取中间的"Target"。

修正后的代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_LINE_LENGTH 256

int main() {
    FILE *textfile = fopen("your_file.txt", "r");
    if (!textfile) {
        perror("Failed to open file");
        return 1;
    }

    char line[MAX_LINE_LENGTH];
    const char *prefix = "V {  ";
    size_t prefix_len = strlen(prefix); // 用strlen获取前缀长度,比硬编码更可靠

    while (fgets(line, MAX_LINE_LENGTH, textfile)) {
        const char *p1 = strstr(line, prefix);
        if (p1 == NULL) {
            continue; // 不匹配前缀的行直接跳过
        }

        // 跳过前缀,定位到<Target>的起始位置
        const char *start = p1 + prefix_len;
        // 找到<的位置(如果确保前缀后一定是<,可以直接用start)
        const char *left_bracket = strchr(start, '<');
        if (left_bracket == NULL) {
            continue;
        }
        // 找到对应的>
        const char *right_bracket = strchr(left_bracket + 1, '>');
        if (right_bracket == NULL) {
            continue;
        }
        // 找到;的位置,确保格式正确
        const char *semicolon = strchr(right_bracket, ';');
        if (semicolon == NULL) {
            continue;
        }

        // 计算Target的长度,分配内存并拷贝
        size_t target_len = right_bracket - (left_bracket + 1);
        char *res = malloc(target_len + 1); // 不需要强制转换malloc返回值
        if (res == NULL) {
            perror("Failed to allocate memory");
            fclose(textfile);
            return 1;
        }
        strncpy(res, left_bracket + 1, target_len);
        res[target_len] = '\0';

        printf("提取到的目标内容:%s\n", res);
        free(res); // 记得释放内存,避免泄漏
    }

    fclose(textfile);
    return 0;
}

关键修正点说明

  • 用strlen获取前缀长度:代替硬编码的偏移量,避免因前缀修改导致的错误。
  • 先判断p1非空再后续操作:避免空指针访问导致的程序崩溃。
  • 精准定位<和>:直接提取两个符号之间的内容,确保得到干净的"Target"。
  • 内存管理:添加malloc失败的判断,用完内存后及时free。
  • 跳过不匹配的行:用continue处理不符合格式的行,避免无效操作。

内容的提问来源于stack exchange,提问作者Jenish Justin Palathingal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 04:50:21