在 C 语言中,"findpattern" 通常指的是在一个字符串或数据块中查找特定的模式(子字符串、字节序列等),以下是几种实现方式,从简单到复杂:

(图片来源网络,侵删)
使用标准库函数 strstr(查找子字符串)
strstr 是 C 标准库 <string.h> 中的函数,用于查找子字符串第一次出现的位置。
示例代码
#include <stdio.h>
#include <string.h>
int main() {
const char *text = "Hello, world! This is a test.";
const char *pattern = "world";
char *result = strstr(text, pattern); // 查找 pattern 在 text 中的位置
if (result != NULL) {
printf("Pattern found at position: %ld\n", result - text);
} else {
printf("Pattern not found.\n");
}
return 0;
}
输出:
Pattern found at position: 7
手动实现字符串模式匹配(朴素算法)
如果不允许使用 strstr,可以手动实现一个简单的模式匹配算法(暴力匹配)。
示例代码
#include <stdio.h>
#include <string.h>
const char *find_pattern(const char *text, const char *pattern) {
int text_len = strlen(text);
int pattern_len = strlen(pattern);
for (int i = 0; i <= text_len - pattern_len; i++) {
int j;
for (j = 0; j < pattern_len; j++) {
if (text[i + j] != pattern[j]) {
break;
}
}
if (j == pattern_len) {
return &text[i]; // 返回匹配的起始位置
}
}
return NULL; // 未找到
}
int main() {
const char *text = "Hello, world! This is a test.";
const char *pattern = "world";
const char *result = find_pattern(text, pattern);
if (result != NULL) {
printf("Pattern found at position: %ld\n", result - text);
} else {
printf("Pattern not found.\n");
}
return 0;
}
输出:

(图片来源网络,侵删)
Pattern found at position: 7
查找二进制模式(字节序列)
如果要在二进制数据(如文件、内存缓冲区)中查找特定的字节序列,可以逐字节比较。
示例代码
#include <stdio.h>
#include <string.h>
void *find_binary_pattern(const void *data, size_t data_len, const void *pattern, size_t pattern_len) {
for (size_t i = 0; i <= data_len - pattern_len; i++) {
if (memcmp((const char *)data + i, pattern, pattern_len) == 0) {
return (void *)((const char *)data + i); // 返回匹配的起始地址
}
}
return NULL; // 未找到
}
int main() {
unsigned char data[] = {0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x2C, 0x20, 0x77, 0x6F, 0x72, 0x6C, 0x64};
unsigned char pattern[] = {0x77, 0x6F, 0x72, 0x6C, 0x64}; // "world" 的 ASCII 码
void *result = find_binary_pattern(data, sizeof(data), pattern, sizeof(pattern));
if (result != NULL) {
printf("Binary pattern found at offset: %ld\n", (const char *)result - (const char *)data);
} else {
printf("Binary pattern not found.\n");
}
return 0;
}
输出:
Binary pattern found at offset: 6
使用正则表达式(更复杂的模式匹配)
如果需要更灵活的模式匹配(如通配符、正则表达式),可以使用 POSIX 正则表达式库 <regex.h>。
示例代码
#include <stdio.h>
#include <regex.h>
#include <string.h>
int main() {
const char *text = "Hello, world! This is a test.";
const char *pattern = "world.*test"; // 匹配 "world" 后跟任意字符直到 "test"
regex_t regex;
int ret;
// 编译正则表达式
ret = regcomp(®ex, pattern, REG_EXTENDED);
if (ret) {
fprintf(stderr, "Failed to compile regex\n");
return 1;
}
// 执行匹配
ret = regexec(®ex, text, 0, NULL, 0);
if (!ret) {
printf("Regex pattern matched!\n");
} else if (ret == REG_NOMATCH) {
printf("Regex pattern not found.\n");
} else {
fprintf(stderr, "Regex error\n");
}
// 释放正则表达式
regfree(®ex);
return 0;
}
输出:

(图片来源网络,侵删)
Regex pattern matched!
| 方法 | 适用场景 | 依赖库 | 特点 |
|---|---|---|---|
strstr |
查找子字符串 | <string.h> |
简单高效,但仅支持字符串 |
| 手动实现 | 自定义字符串匹配 | 无 | 可扩展性强,但效率较低 |
memcmp |
二进制数据匹配 | <string.h> |
适用于字节序列 |
| 正则表达式 | 复杂模式匹配 | <regex.h> |
支持通配符、正则语法 |
根据需求选择合适的方法:
- 简单字符串匹配 →
strstr - 二进制数据 →
memcmp或手动实现 - 复杂模式 → 正则表达式
