C语言中使用strstr()提取指定子串后内容的问题排查
问题分析与解决
你的代码存在几个关键问题,导致无法正确提取目标内容:
- 未跳过前缀字符串:
p1指向的是"V { "的起始位置,你需要先跳过这个前缀才能定位到<Target>部分。 - 空指针访问风险:在调用
strstr(p1, ";")前没有判断p1是否为NULL,会导致未定义行为。 - 未处理
<>包裹的内容:直接截取到;的话会包含<>,需要进一步提取中间的"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
相关产品推荐
相关产品推荐

