在 C 标准库中,memchr函数用于在内存块中查找特定的字符。它是一个通用的内存搜索函数,适用于任意类型的数据。

memchr 函数头文件

memchr函数的头文件是<string.h>。在使用memchr函数之前,确保在你的 C 代码中包含这个头文件:

#include <string.h>

memchr 函数原型

void *memchr(const void *s, int c, size_t n);

memchr函数用于在s指向的对象的前n个字符里(每个字符解释为unsigned char),定位c第一次出现的位置。

参数说明

  • s:要搜索的内存块指针;
  • c:要查找的字符值,会被转换为unsigned char
  • n:要搜索的字节数;

返回值

memchr函数找到字符时,返回所定位字符的指针;如果字符未找到,则返回空指针NULL

memchr 示例代码

计算字符在内存块中的位置

只需要以memchr函数的返回值减去内存块的起始地址,就可得到偏移量;但是还要考虑memchr函数可能返回空指针的情况;

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

int main() {

    const char *src = "perfcode.com";

    char target_char = '.';

    long int offset;

    char* target_ptr = memchr(src, target_char, strlen(src));
    
    if (target_ptr == NULL) {

        printf("target byte not found.\n");

    } else {

         offset = target_ptr - src;

         printf("offset = %ld\n", offset);
        
    }

    return 0;
}

得到文件的扩展名

memchr函数可用来查找分隔符或特定标志,例如,在 CSV 文件或其它自定义格式中查找字段分隔符。

这个例子中,用来获取文件名中的扩展名:

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

int main() {

    const char* filename = "example.exe";

    char* extension = memchr(filename, '.', strlen(filename));

    if (extension == NULL) {

        printf("The %s file has no extension.\n", filename);

    }
    else {

        printf("The %s file extension is: %s\n", filename, extension);

    }

    return 0;
}