C memchr() 函数

C memchr() 语法

memchr() 是 C 语言 <string.h> 或 <memory.h> 标准库的一个函数,它用于在 “指定的内存区域” 中搜索 “第一次出现特定字节值” 的位置。

语法:

memchr(s, c, n)

说明:

memchr() 函数接收以下 3 个参数。

  • s(const void*):要搜索的内存块的指针。这是一个 const void* 指针,表示它指向的数据不会被修改。
  • c(int):要查找的字节值。虽然参数类型是 int,但在搜索时会将其转换为一个无符号字符(unsigned char),然后查找内存中匹配这个字节值的第一个位置。
  • n(size_t):要搜索的字节数。

memchr(s, c, n) 会从 s 指向的内存位置开始,逐字节地检查其后连续的 n 个字节,查找第一个值等于 c 转换而来的字节的字节。搜索会在找到匹配字节或检查完 n 个字节后停止。

memchr() 函数会返回一个指向在内存块中找到的第一个匹配字节的指针。

  • 如果在指定的 n 个字节范围内找到了值为 c 的字节,那么 memchr() 会返回一个指向该字节位置的指针。
  • 如果在指定的 n 个字节范围内没有找到值为 c 的字节,那么 memchr() 会返回 NULL。

提示: memchr 是 “memory character” 的缩写。

C memchr() 摘要

使用频率
修改字符串
官方文档 查看

C memchr() 示例

接下来,我们通过几个简单的例子来讲解一下 C memchr() 函数是如何使用的。

示例 1:memchr() 在 “字符数组” 中查找 “特定字符”

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

int main(void)
{
    const char str[] = "Hello Lvye";
    int ch = 'L';                    // 要查找的字符 'L'
    size_t length = strlen(str);     // 在整个字符串中搜索

    void *result = memchr(str, ch, length);
    if (result != NULL) {
        printf("字符位置: %td\n", (char *)result - str);
    } else {
        printf("未找到字符\n");
    }

    return 0;
}

运行结果如下。

字符位置 : 6

分析:

这个例子实现的功能是:在字符串 "Hello Lvye" 中查找字符 'L'。我们将要搜索的字节数设置为字符串的长度,最终 memchr() 函数找到了 'L' 并返回指向该位置的指针

其中,通过指针减法,我们可以计算出该字符在字符串中的索引位置。

示例 2:memchr() 在 “二进制数据“ 中查找 “指定字节序列”

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

int main(void)
{
    unsigned char data[] = {0x1A, 0x2B, 0x3C, 0x00, 0x4D, 0x5E, 0x00, 0x6F};   // 包含嵌入的 0x00
    int ch = 0x00;        // 要查找的字节值 0x00
    size_t length = sizeof(data);

    void *result = memchr(data, ch, length);
    if (result != NULL) {
        printf("偏移量 (字节) : %td\n", (unsigned char *)result - data);
    } else {
        printf("未找到字节值\n");
    }

    return 0;
}

运行结果如下。

偏移量(字节) : 3

分析:

memchr() 非常适合在二进制数据中查找指定字节值。在这个例子中,我们在一个包含多个 0x00 字节的二进制数据块中查找 0x00,最终 memchr() 找到了第一个 0x00 字节并返回其地址。

memchr() 与 strchr() 的区别

memchr() 和 strchr() 都用于查找特定字符或字节的第一次出现位置,但它们之间有重要区别:

  • strchr(): 专门用于在 “以空字符 '\0' 结尾的字符串” 中查找特定字符。它从字符串开头搜索,直到找到第一个匹配字符或到达字符串的终止符 '\0'。搜索范围由字符串的实际长度决定。
  • memchr(): 用于在 “任意内存块” 中查找特定字节值。它搜索指定的 n 个字节,不关心是否遇到终止符 '\0'。搜索范围由参数 n 精确指定。

简单来说,strchr() 是面向字符串的,并在遇到 '\0' 时停止搜索。而 memchr() 是面向内存块的,并精确搜索指定的字节数。

memchr() 的应用场景

在实际开发中,memchr() 函数主要用于以下场景:

  • 在已知大小的缓冲区或数组中查找特定字节。
  • 处理可能包含嵌入式 '\0' 字符的二进制数据时,查找特定字节模式。
  • 在文件 I/O 或网络通信中,查找数据流中的特定标记或分隔符。
  • 实现需要精确字节搜索的底层函数。

与 strchr() 相比,memchr() 提供了更底层、更灵活的字节搜索能力,特别适用于处理非字符串数据或需要跨越 '\0' 字符进行搜索的情况。

上一篇: memcmp()

下一篇: strupr()

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号