C语言findpattern函数如何实现模式匹配?

99ANYc3cd6
预计阅读时长 15 分钟
位置: 首页 C语言 正文

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

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;
}

输出:

c 语言 findpattern
(图片来源网络,侵删)
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(&regex, pattern, REG_EXTENDED);
    if (ret) {
        fprintf(stderr, "Failed to compile regex\n");
        return 1;
    }
    // 执行匹配
    ret = regexec(&regex, 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(&regex);
    return 0;
}

输出:

c 语言 findpattern
(图片来源网络,侵删)
Regex pattern matched!

方法 适用场景 依赖库 特点
strstr 查找子字符串 <string.h> 简单高效,但仅支持字符串
手动实现 自定义字符串匹配 可扩展性强,但效率较低
memcmp 二进制数据匹配 <string.h> 适用于字节序列
正则表达式 复杂模式匹配 <regex.h> 支持通配符、正则语法

根据需求选择合适的方法:

  • 简单字符串匹配 → strstr
  • 二进制数据 → memcmp 或手动实现
  • 复杂模式 → 正则表达式
-- 展开阅读全文 --
头像
dede后台登录提示用户名不存在怎么办?
« 上一篇 2025-12-20
C语言16 b c)指什么?
下一篇 » 2025-12-20

相关文章

取消
微信二维码
支付宝二维码

目录[+]