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的魔法藏书室、
C语言学习之我见-memchr()内存查找字符函数的更多相关文章
- Oracle 截取、查找字符函数(持续更新)
整理一些常用的截取.查找字符函数: 1.查找某一个字符串中某一个字符(串)出现的次数 SELECT LENGTH(REGEXP_REPLACE(REPLACE('anne<br>lily& ...
- C语言中常用的string.h的字符函数
strcmp 字符串比较函数 原型: int strcmp(char *str1, char *str2); 例子: ) printf("buffer 1 is greater than b ...
- C语言学习之我见-malloc和free内存申请及释放函数
malloc函数负责向计算机申请确定大小的内存空间. free函数负责释放malloc的申请空间. (1)函数原型 void free(void *_Memory); void * malloc(si ...
- C语言学习之我见-strlen()字符串长度函数
strlen()函数,负责给出字符串的长度.注意是字符串的长度,不是字符数组的长度. (1)函数原型: size_t __cdecl strlen(const char *_Str); (2)头文件` ...
- C语言学习之我见-strcpy()字符串复制函数
strcpy()函数,用于两个字符串值的复制. (1)函数原型 char * strcpy(char * _Dest,const char * _Source); (2)头文件 string.h (3 ...
- C语言学习之我见-strncat()可调整的字符串拼接函数
strncat()函数,用于两个字符串的拼接. (1)函数原型 char * strncat(char * Dest,const char * Source,size_t _Count)` (2)头文 ...
- C语言学习之我见-strcat()字符拼接函数(有缺陷)
strcat()函数,用于两个字符串的拼接. (1)函数原型: char * strcat(char *Dest,const char * Source); (2)头文件: #include < ...
- C语言学习之我见-strncpy()字符串复制函数(可控制范围)
strncpy()函数,用于两个字符串值的复制. (1)函数原型 char *strncpy(char * _Dest,const char * _Source,size_t _Count); (2) ...
- C语言学习之我见-strncmp()字符串比较函数(控制范围)
strncmp()函数,用于范围内,两个字符串的比较,n表示最大比较范围. (1)函数原型 int strncmp(const char *_Str1,const char *_Str2,size_t ...
随机推荐
- 在keil中加入DSP库并且使用arm_math.h
如果不开启硬件FPU,代码设置和编译控制建议二选一,否则会出现宏定义重复定义的报错
- 帝国cms随机调用信息
我们知道,帝国cms随机调用标签是 [ecmsinfo]1,5,32,0,0,2,0,",'rand()'[/ecmsinfo] 但是这种调用方式在数据量特别大的时候严重影响生成速度,对于中 ...
- Python接入企业微信 - 推送信息到内部群里
前言 之前一篇文章提到了使用wechatpy库来实现企业微信应用登录:Django + Taro 前后端分离项目实现企业微信登录 其实这个库可以实现的功能非常多,基本微信开发涉及到的功能都能实现. 本 ...
- SpringBoot内外部配置文件加载和优先级
直接附链接:https://www.pianshen.com/article/28711537583/
- Web安全中的常见Session攻击(预测+劫持+固定)
攻击者至少可以通过以下三种方式来获取一个有效的session标识符: 1.预测 2.捕获(劫持) 3.固定 一.会话预测 预测这种方式,也就是攻击者需要猜测出系统中使用的有效的session标识符(P ...
- sql语句——DML
DML:增删改表中数据 1. 添加数据: * 语法: * insert into 表名(列名1,列名2,...列名n) values(值1,值2,...值n); * 注意: 1. 列名和值要一一对应. ...
- 工作小记:企业微信 嵌H5页面 用户权限获取匹配
一.背景 领导让研究一个活儿:企业微信开发H5应用,微信端客户进入H5页面跟现有的Web系统打通用户权限.通俗的讲:嵌入企业微信H5页面,客户点进去按原权限加载内容.开发者中心有文档,附上两个关键链接 ...
- 登录口爆破之ldap的md5加密、验证码认证
ldap的md5加密配合autoDecoder插件.captcha-killer-modified插件 autoDecoder例 需要传入的数据包为: {"username":&q ...
- Windows下搭建redis 哨兵环境
从 https://github.com/tporadowski/redis/releases 下载windows版的redis,自行下载解压. 关于哨兵模式的讲解,强烈推荐 [深入学习redis(4 ...
- 『现学现忘』Git基础 — 19、Git中忽略文件
目录 1.忽略文件说明 2.忽略文件的原则 3..gitignore忽略规则 1.忽略文件说明 有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们到本地版本库,通常都是些自动生成的文件. ...