今天来更新几个关于字符串的函数
1.strlen--求字符串长度
2.strcpy--长度不受限制的字符串函数,模拟实现
3.strcat--长度不受限制的字符串函数,模拟实现
4.strcmp--长度不受限制的字符串函数,模拟实现
5.strncpy,strncat,strncmp--长度受限制的字符串函数介绍
6.strstr--字符串查找
1.strlen
首先声明:size_t strlen ( const char * str );
这个函数的作用是统计‘\0’之前的字符个数,同时这个字符串必须要以‘\0’结束,函数的返回值为size_t,是无符号整型,这里要特别注意,看如下程序输出:
strlen有三种模拟实现的方法:
1.计数器方式:
2.不能创建临时变量,也就是使用递归的方法
3.通过指针减去指针的方法
2.strcpy的模拟实现
这个函数的作用就是将一个字符串内容拷贝到另一个字符串中
直接上图 ,这个程序里面红框的都是优化之后的版本,
首先char*和ret对应,因为该函数返回值就是一个char类型的指针,且该指针指向目标地址的首字符地址。
其次就是const,保证源字符串不被修改。
还有断言部分的优化,不用写两个assert保证源和目标都不是空指针。
至于whlile循环体中的语句,因为要将源字符串中的内容包括\0全部copy到目标字符串中,所以当src指向的内容不等于\0时,就会一直赋值,当等于\0时,while判断到ASCII码值为0,所以跳出循环,正好将\0读完。
接下里就时printf函数中的链式访问,通过%s打印出目标地址所指向的内容。
这个strcpy还有非常重要的一点就是,他在深信服面试中出现过多次,问题是strcpy在使用过程中有什么缺陷?答案呢其实也非常简单,就是说strcpy在运行的时候,比较粗暴,他不管你其他内存是否已经占用,也就是并不检查目的缓冲区的大小边界,而是将源字符串逐一的全部赋值给目的字符串地址起始的一块连续的内存空间,同时加上字符串终止符,会可能导致其他变量被覆盖。
3.strcat模拟实现
这里的源字符串必须以 '\0' 结束,原因是在读取源字符串的时候,要读到 '\0' 才能结束。
字符串不能自己给自己追加
首先将dest的首地址存起来准备作为返回值,接下来断言,之后先用while循环找到dest的\0之后的过程就和strcpy一样了
4. strcmp模拟实现
5.strnpy,strncat,strncmp
5.1 strnpy
这个函数就是比strcpy多了一个指定的copy个数,需要注意的是,如果指定的copy个数大于了源字符串个数,会将\0补入目标字符串,如下图调试所示:
5.2 strncat
这个函数也同样是指定了个数去在目标字符串后面追加源字符串内容,不过与上面不一样的是,即使指定了5,最后传过去就是4个。
5.3strncmp
这个就更简单了,看一下就好
6.strstr 字符串查找
先看strstr函数的基本使用方法
这个函数的作用是在str1中查找第一次出现str2的位置,不包含\0
再来模拟实现