memchr/strchr/strrchr区别
1.函数原型
void *memchr(const void *str, int c, size_t n);
char *strchr(const char *str, int c);
char *strrchr(const char *str, int c);
2.函数功能
- memchr: 在参数 str 所指向的存储空间的前 n 个字节中搜索第一次出现字符 c(一个无符号字符)的位置。返回一个指向匹配字节的指针,如果在给定的内存区域未出现字符,则返回 NULL。
- strchr: 在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置。返回在字符串 str 中第一次出现字符 c 的位置,即指针。如果未找到该字符则返回 NULL。
- strrchr: 在参数 str 所指向的字符串中搜索最后一次出现字符 c(一个无符号字符)的位置。返回 str 中最后一次出现字符 c 的位置,即指针。如果未找到该值,则函数返回NULL。
3.memchr和strchr的区别
-
memchr取的是str所在的存储空间,而不管字符串是否结束,其结束标志只跟参数n有关。
-
而strchr只要字符串结束就停止查找。
代码举例说明:
int main()
{
char str1[20]="Hello World";
char ch = 'd';
char *retchar;
str1[5] = 0;//截断str1字符串
retchar = (char *)memchr(str1,ch,sizeof(str1));
printf("字符串中第一个 [%c] 所在位置(相对字符串首地址)%d\n", ch, retchar-str1);
printf("[%c] 之后的字符串是 - [%s]\n", ch, retchar);
retchar = (char *)strchr(str1,ch);
if(retchar != NULL)
printf("字符串中第一个 [%c] 所在位置(相对字符串首地址)%d\n", ch, retchar-str1);
else
printf("字符串 [%s] 中未找到字符 [%c]\r\n",str1,ch);
system("pause");
return 0;
}
运行结果如下:
4.strchr和strrchr的区别
- strchr是找字符在字符串中第一次出现的位置;
- strrchr是找字符在字符串中最后一次出现的位置。
代码举例说明:
int main()
{
char str1[20]="Hello World";
char ch = 'o';
char *retchar;
retchar = (char *)strchr(str1,ch,sizeof(str1));
if(retchar != NULL)
{
printf("字符串中第一个 [%c] 所在位置(相对字符串首地址)%d\n", ch, retchar-str1);
printf("[%c] 之后的字符串是 - [%s]\n", ch, retchar);
}
else
printf("字符串 [%s] 中未找到字符 [%c]\r\n",str1,ch);
retchar = (char *)strrchr(str1,ch);
if(retchar != NULL)
{
printf("字符串中最后一个 [%c] 所在位置(相对字符串首地址)%d\n", ch, retchar-str1);
printf("[%c] 之后的字符串是 - [%s]\n", ch, retchar);
}
else
printf("字符串 [%s] 中未找到字符 [%c]\r\n",str1,ch);
system("pause");
return 0;
}
结果如下:
5.源码
/************************************************************************
*功能:在参数 str 所指向的存储空间的前 n 个字节中搜索第一次出现字符 c(一个无符号字符)的位置。
*输入:str:要执行的内存块
* c:以 int 形式传递的值,但是函数在每次字节搜索时是使用该值的无符号字符形式。
* n:要被分析的字节数
*输出:无
*返回:返回一个指向匹配字节的指针,如果在给定的内存区域未出现字符,则返回 NULL。
************************************************************************/
void *Mymemchr(const void *str, int c, size_t n)
{
char *temp;
if(str == NULL)
{
printf("字符串为空\r\n");
exit(-1);
}
temp = (char*)str;
while(n > 0)
{
if(*temp == c)
return (void *)temp;
n --;
temp ++;
}
return NULL;
}
/************************************************************************
*功能:在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置。
*输入:src:要被检索的 C 字符串。
* c:在 str 中要搜索的字符。
*输出:无
*返回:返回在字符串 str 中第一次出现字符 c 的位置,如果未找到该字符则返回 NULL。
************************************************************************/
char *Mystrchr(const char *str, int c)
{
char *temp;
if(str == NULL)
{
printf("字符串为空\r\n");
exit(-1);
}
temp = (char *)str;
while(*temp != 0)
{
if(*temp == c)
return temp;
temp ++;
}
return NULL;
}
/************************************************************************
*功能:在参数 str 所指向的字符串中搜索最后一次出现字符 c(一个无符号字符)的位置。
*输入:src:要被检索的 C 字符串。
* c:在 str 中要搜索的字符。
*输出:无
*返回:返回 str 中最后一次出现字符 c 的位置。如果未找到该值,则函数返回一个空指针。
************************************************************************/
char *Mystrrchr(const char *str, int c)
{
char *temp,*ret;
if(str == NULL)
{
printf("字符串为空\r\n");
exit(-1);
}
temp = (char *)str;
ret = NULL;
while(*temp != 0)
{
if(*temp == c)
ret = temp;
temp ++;
}
return ret;
}
原创不易,转载请注明出处。