一、memchr()函数声明
void * memchr (const void * buf,int chr,size_t cnt )
// 函数功能:在“buf”地址的前“cnt”个字节中寻找"chr"字节
// 成功返回 “chr”所在位置的指针
// 失败返回 null
二、memchr()函数原型
void * memchr (const void * buf,int chr,size_t cnt )
{
//当(buf!= chr) && cnt 条件满足执行循环
while ( cnt && (*(unsigned char *)buf != (unsigned char)chr) )
{
buf = (unsigned char *)buf + 1;//指针自增赋值,类似数组的自增遍历
cnt--; //cnt个字节自减
}
return(cnt ? (void *)buf : NULL);//当cnt为真则找到chr并返回buf指针,否则返回NULL
}
三、应用实例
①size_t cnt等于str[]长度
int main (void)
{
const char str[] = "abcdefghijk";//初始化数组
const char chr = 'j';//定义chr的内容
char *ret;//返回值存储地址
ret = (char*)memchr(str, chr, sizeof(str));
printf("ch = %s.\r\n",ret); //打印ret接收的返回值
return 0;
}
结果:
②size_t cnt小于str[]长度
int main (void)
{
const char str[] = "abcdefghijk";//初始化数组
const char chr = 'c';//定义chr的内容
char *ret;//返回值存储地址
ret = (char*)memchr(str, chr, 5);
printf("chr = %s.\r\n",ret); //打印ret接收的返回值
return 0;
}
结果:
③chr在size_t cnt之后
int main (void)
{
const char str[] = "abcdefghijk";//初始化数组
const char chr = 'g';//定义chr的内容
char *ret;//返回值存储地址
ret = (char*)memchr(str, chr, 5);
printf("chr = %s.\r\n",ret); //打印ret接收的返回值
return 0;
}
结果:
四、总结分析
根据实例①②③得出结论
当size_t cnt等于内存地址长度,匹配到chr之后就返回内存地址所存数据中chr并包含chr的全部字节
当size_t cnt小于内存地址长度,匹配到chr之后就返回内存地址所存数据中chr并包含chr的全部字节
当size_t cnt内没有匹配到chr,就会返回NULL