• 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的魔法藏书室

  • 相关阅读:
    确认端口占用
    [转]自建Syncthing中继服务器(私密传输或造福大众)
    【转】Syncthing – 数据同步利器---自己的网盘,详细安装配置指南,内网使用,发现服务器配置
    【转】搭建和配置Syncthing发现和中继服务器
    【转】Syncthing的安装与使用
    pycrypto安装出错的问题 intmax_t C:Program Files (x86)Windows Kits10include10.0.10240.0ucrtinttypes.
    Git从库中移除已删除大文件
    词云图
    [转].NET 性能测试工具 -- 事件跟踪器(ETW)
    [转]ANTS Performance Profiler和ANTS Memory Profiler 使用
  • 原文地址:https://www.cnblogs.com/zobol/p/14349702.html
Copyright © 2020-2023  润新知