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 ...
随机推荐
- 【转】shim.ChaincodeStubInterface用法
作为记录 shim.ChaincodeStubInterface用法
- 检查oracle是否是rac
采样rac集群 [root@shfpdb02 disks]# cat /etc/redhat-release Red Hat Enterprise Linux Server release 6.4 ( ...
- oracle创建dblink注意事项 ORA-04052
BEGIN; oracle创建dblink语句: create database link dblink名称 connect to 用户名 identified by 密码 using '(DESCR ...
- 关于 background-image 渐变gradient()那些事!
大家好,我是半夏,一个刚刚开始写文的沙雕程序员.如果喜欢我的文章,可以关注 点赞 加我微信:frontendpicker,一起学习交流前端,成为更优秀的工程师-关注公众号:搞前端的半夏,了解更多前端知 ...
- vscode设置vue文件高亮显示
打开VS Code,左上角 文件->首选项->设置->文本编辑器->文件,点击右侧的"在settings.json中编辑",进入settings.json文 ...
- web服务报错类型
401:无权限(HttpStatus.UNAUTHORIZED) 404:页面找不到 405:不支持get/post请求,如只支持get请求但传了post请求 400:请求格式错误,如不为null但传 ...
- XCTF练习题---MISC---something_in_image
XCTF练习题---MISC---something_in_image flag:Flag{yc4pl0fvjs2k1t7T} 解题步骤: 1.观察题目,下载附件,这是一道2019湖湘杯的题目 2.下 ...
- stm32F103C8T6通过写寄存器点亮LED灯
因为我写寄存器的操作不太熟练,所以最近腾出时间学习了一下怎么写寄存器,现在把我的经验贴出来,如有不足请指正 我使用的板子是stm32F103C8T6(也就是最常用的板子),现在要通过写GPIO的寄存器 ...
- 【CSAPP】Performance Lab 实验笔记
perflab这节的任务是利用书中知识,来对图像处理中的Rotate和Smooth操作函数进行优化.这次没对上电波,觉得学了一堆屠龙之技.于我个人理解,现在计算机配置比以前高多了,连SWAP分区都几近 ...
- Windows与Linux如何实现相互远程桌面连接?
今天跟大家一起讨论下,利用Windows自带的远程桌面连接工具,实现远程Linux桌面及在Linux系统中远程Windows桌面 一.Windows远程Linux桌面 1)本次实验以CentOS 7. ...