C语言学习之我见memchr()内存查找字符函数

memchr()内存查找字符函数:主要用于从内存中查找自己需要的字符位置。

(1)函数原型:

void *memchr(const void *_Buf ,int _Val,size_t _MaxCount)

(2)头文件

#include <string.h>

(3)功能:

在内存中,从第一个变量const void *_Buf给出的内存地址开始,以字节为单位,按照第二个变量int _Val所对应的字节值查询。

如果有则返回所对应的字节内存地址,如果没有则返回NULL或者奔溃。

第三个变量size_t _MaxCount表示查询的最大范围。

(4)基础实例代码:

    char a[]="hello zobol!";
    char c='z';
    char* ret;
    
    ret =  (char*)memchr(a,c,strlen(a));
    printf("%c",*ret);//*的意思是取出地址所对应内存位置的值 
    printf("%s",ret);//%s是用于字符串输出,输入一个内存的地址,会自动输出从开头到\0的值

(5)输出情况:

 (6)问题1:int _Val的取值范围0~255,可以超过吗?:

  回答:不可以,int_Val的值对应是一字节二进制0000 0000~11111111的无符号数值,不可以超过否则会发生错误,程序直接奔溃,不是返回空指针。一般情况下用char表示,自动强制转换为int比较好。

  实例代码:

    char b[]="公众号:zobol的魔法藏书室";
    int vali = 111;//'o'的对应ascii码
    int vali2 = 300; //超限值 
    char* ret2 =  (char*)memchr(b,vali,15);
    char* ret3 =  (char*)memchr(b,vali2,7);
    printf("%c\n",*ret2);//*的意思是取出地址所对应内存位置的值 
    printf("%s\n",ret2);//%s是用于字符串输出,输入一个内存的地址,会自动输出从开头到\0的值
    printf("%c\n",*ret3);//*的意思是取出地址所对应内存位置的值 
    printf("%s\n",ret3);

  运行情况:

 (注意返回值,程序是直接奔溃,不是正常结束)

 (7)问题2:用于字符串查找,不知道字符串长度怎么办?

  回答:用strlen()函数获取,不能像python那样用-1表示结尾,C语言中字符串不是对象没有被封装。

(8)问题3:对于'\0'能查找吗?

  回答:可以,memchr针对的是一段内存,而不是一个字符串,只要二进制对于的值相等,就会返回。

(9)问题4:如果有两个重复的字符值,在查找范围内,返回哪一个?

  回答:返回离const void *_Buf开头内存地址最近的字符地址。

  示例代码:

    char c[]="公众号:zobol的魔法藏书室";
    int valii = 111;//'o'的对应ascii码
    char* ret4 =  (char*)memchr(c,valii,strlen(c));
    char* ret5 =  (char*)memchr(ret4+1,valii,strlen(c));//内存地址加1,跳过第一个o 
    printf("%s\n",ret4);
    printf("%s\n",ret5);

  运行情况:

(10)问题5:如果size_t _MaxCount范围超过字符串长度,或者在合法范围内没有找到符合的字符值,会返回什么?

  回答:并不是返回空指针,经过测试,是直接奔溃。(在不同编译器也许实现不一样)

 

 如有收获,欢迎关注博主的个人公众号:zobol的魔法藏书室

原文地址:https://www.cnblogs.com/zobol/p/14349702.html