/* PC上食用更佳哦!
代码目录:linux4.9.88内核lib目录
date:2022年7月12日
*/
一、strchr
1.声明
char *strchr(const char *s, int c);
2.作用
在s指向的字符中查找第一次出现的字符c,并返回该字符的位置
3.源码
char *strchr(const char *s, int c)
{
for (; *s != (char)c; ++s)
if (*s == '\0')
return NULL;
return (char *)s;
}
4.说明
执行*s != (char)c ,判断当前指针指向的的值是否和c相等,并判断*s == '\0' ,如果相等说明在s指向的字符中没有c,返回NULL,否则返回第一次出现字符c的指针的位置
5.示例
#include<stdio.h>
#include<string.h>
void main()
{
char arr[] = "ABCDEFGD";
char ser = 'D', ser1 = 'k';
char *ret,*ret1;
ret = strchr(arr,ser);
ret1 = strchr(arr,ser1);
printf("找到后返回的值:%s\n",ret);
printf("找不到返回的值:%s\n",ret1);
}
看到木有,返回的指针指向了第一个’D’的位置及其之后的空间
找到后返回的值:DEFGD
找不到返回的值:(null)
二、strrchr
1.声明
char *strrchr(const char *s, int c);
2.作用
strrchr和strchr作用一样,只不过strrchr相当于从后向前找第一个出现c的位置(而代码则是从前向后找,找到最后一个)
3.源码
char *strrchr(const char *s, int c)
{
const char *last = NULL;
do {
if (*s == (char)c)
last = s;
} while (*s++);
return (char *)last;
}
4.说明
参考strchr的说明
5.示例
直接在strchr的例子中把ret = strchr(arr,ser); 改为ret = strrchr(arr,ser);
找到后返回的值:D
找不到返回的值:(null)
三.strchrnul
1.声明
char *strchrnul(const char *s, int c);
2.作用
和strchr的区别是:当在s中找不到c时,strchr返回NULL,而strchrnul返回一个null, the null byte at the end of s 应该就是s的结束符’\0’
3.源码
char *strchrnul(const char *s, int c)
{
while (*s && *s != (char)c)
s++;
return (char *)s;
}
4.说明
*s && *s != (char)c 这一步保证*s 字符不为’\0’,且判断*s 和c是否相等,两者必须同时为真。当*s 为空或者*s 和c相等了,不在循环,并返回*s
5.示例
#define _GNU_SOURCE 要加在首行 VC++6.0运行不了,放到虚拟机中实验
#define _GNU_SOURCE
#include<stdio.h>
#include<string.h>
void main()
{
char arr[] = "ABCDEFGD";
char ser = 'D', ser1 = 'k';
char *ret,*ret1;
ret = strchrnul(arr,ser);
ret1 = strchrnul(arr,ser1);
printf("找到后返回的值:%s\n",ret);
printf("找不到返回的值:%s\n",ret1);
}
从结果可以看到,strchrnul也是从前向后找的
找到后返回的值:DEFGD
找不到返回的值:
|