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' 字符进行搜索的情况。
