在编程的过程中,我们经常要处理字符和字符串,为了⽅便操作字符和字符串,C语⾔标准库中提供了
⼀系列库函数,接下来我们就学习⼀下这些函数。
1.strlen的使用和模拟实现。
1.1strlen的使用
size_t strlen ( const char * str );
strlen函数的功能是统计字符串的个数,直至遇到'\0'停止。
对于strlen,我们要注意一下事项:
1.字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包
含 '\0' )。
2.字符串末尾必须有'\0'才能计算出正确值,否则会越界查找,直至遇到'\0'停止,从而使结果出现错误。
3.strlen的返回值是size_t类型,是无符号的数。
这段代码运行结果为 3和随机值
因为str1末尾会自动添加一个'\0',而str2末尾没有'\0',故strlen会越界直至找到'\0'为止,故结果为随机值。
2.strlen的模拟实现
既然我们知道了strlen函数的功能,那么strlen函数怎么模拟实现呢?接下来我们就来模拟实现strlen函数。
方法一:计数器
在这段代码中,我们创建了一个临时变量count,当str指向的不是'\0',count就加一,最后返回count,从而模拟实现了strlen函数。
那么有没有不创建临时变量的方法来模拟实现strlen函数呢?
不创建临时变量的话,刚开始看到这要求可能会让我们无从下手,但是仔细想想不难发现我们可以用函数递归的方法来实现。
方法二:递归实现
方法三:指针运算
最开始p指向字符串的首字符,s也指向首字符,最后经过while循环后p指向了'\0',而p-s为指针减去指针,返回的是二者之间的元素个数,从而求出字符串的长度。
3.strcat的模拟实现
char*strcat(char*dest,const char*src);
其中,dest
是目标字符串,src
是源字符串。strcat
函数将源字符串的内容追加到目标字符串的末尾,并返回指向目标字符串的指针。
需要注意的是,目标字符串必须有足够的空间来容纳源字符串的内容,否则会发生未定义的行为(如内存溢出)。
需要注意的一点是strcat函数不能自己追加自己,否则会越界访问使程序崩溃!
像这样,我们就把str2的内容追加到了str1中,那么strcat又该如何模拟实现呢?
像这样,我们先通过ret指针接收dest,从而得到函数最终的返回值;
接着我们用while循环使dest指向str1的'\0';
最后我们进行字符串拷贝,从而模拟实现了strcat函数;
4.strcmp的使用和模拟实现
int strcmp(const char* str1,const char* str2);
那么它是怎么比较的呢?
strcmp会比较两个字符串对应位置上(相同位置,比如第一位,第二位)的字符的ASCII值;
我们先来看下面这个例子:
那么strcmp怎么模拟实现呢?
5.strstr的使用和模拟实现
char*strstr(const char*str1,const char*str2);
它接受两个参数:
str1:要在其中搜索的字符串。
str2:要搜索的子字符串。
函数返回一个指向 str1中第一次出现 str2
的指针,如果未找到,则返回 NULL
。
这段代码简单的应用了一下strstr
那么strstr函数又该如何模拟实现呢?
这段代码模拟实现了strstr函数