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