1. 求字符串长度库函数strlen
❤️size_t strlen ( const char * str )
⭐️字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )。
⭐️参数指向的字符串必须要以 '\0' 结束。
⭐️注意函数的返回值为size_t,是无符号的
更详细的了解我们在《strlen库函数》这篇博客里有更多的解释,这里的模拟实现就不在过多赘述,直接上代码使用:
1.1 strlen库函数的一般使用
1.1.1 strlen用来求字符串长度
我们通过调试发现,对于字符串的存储,默认是有\0的;我们在用strlen计算长度时,不包括\0;只计算\0前面的字符个函数;所以最终结果就是4!
1.1.2 利用strlen的返回值特性比较大小
我们已经知道strlen的返回值是size_t,是无符号的;所以我们和有符号数比较大小时,就需要先把有符号数转换成无符号数之后;在比较大小:
比如这个例题:如果我们不了解strlen返回的是无符号数,直接比较大小,结果就是6>-1,打印>;但实际上结果确实< !我们需要把有符号数-1转换成无符号数;然后在比较大小:
所以最终结果是:<
1.2 strlen库函数的模拟实现
1.2.1 计数器法
1.2.2 函数递归法
1.2.3 指针-指针法
2. 拷贝字符串库函数strcpy
❤️char* strcpy(char * destination, const char * source )
⭐️源字符串必须以 '\0' 结束。
⭐️会将源字符串中的 '\0' 拷贝到目标空间。
⭐️目标空间必须足够大,以确保能存放源字符串。
⭐️目标空间必须可变。
更详细的了解我们在《strcpy库函数》这篇博客里有更多的解释,这里的模拟实现就不在过多赘述,直接上代码使用:
2.1 strcpy和strncpy库函数的一般使用
这里我们就暂且明白一点:
1、strcpy是长度不受限制的字符串函数,语法是:strcpy(数组1,数组2),拷贝的时候会把\0也拷贝过去!
2、strncpy是长度受限制的字符串函数,语法是:strncpy(数组1,数组2,n),能用做自己拷贝自己。拷贝的时候不会把\0拷贝过去!
2.1.1 strcpy库函数的使用
在拷贝的时候要注意最重要的两点:
1.要拷贝的必须包括\0,把\0也要拷贝过去;
2.原来的字符串必须足够大,这样才能把所需字符串拷贝过去;
要是原来里面没有数据,当然会直接拷贝过去;要是原来有数据,会进行覆盖。这里只是拷贝,并不是追加!
2.1.2 strncpy库函数的使用
第一种情况:拷贝的长度 < 字符串本身的长度
第二种情况:拷贝的长度 > 字符串本身的长度
当然,我们也可以用strncpy来自己拷贝自己,但是没有什么实际意义!我们只需要明确一点strncpy并不会把\0拷贝过去;但是当拷贝的长度>字符串本身的长度时,它会利用\0进行填充凑个数,强行凑够你要拷贝的字符元素个数!
2.2 strcpy库函数的模拟实现
方法1:
方法2:
方法3:
3. 追加字符串库函数strcat
❤️char * strcat ( char * destination, const char * source )
⭐️源字符串必须以 '\0' 结束。
⭐️目标空间必须有足够的大,能容纳下源字符串的内容。
⭐️目标空间必须可修改。
3.1 strcat和strncat库函数的一般使用
这里我们就暂且明白一点:
1、strcat是长度不受限制的字符串追加函数,语法是:strcat(数组1,数组2)。会把\0也传过去!
2、strncat是长度受限制的字符串追加函数,语法是:strncat(数组1,数组2,n),能用做自己追加自己的串。也会把\0也传过去!
3.1.1 strcat库函数的使用
追加时的注意点:
1.数组arr1和数组arr2都要有\0;追加是从arr1的\0开始追加的,用arr2的首地址来覆盖掉arr1的\0,同时把arr2的\0也会追加过来;
2.arr1数组的大小要足够大;
从这里我们也能看出为什么strcat不能自己追加自己?比如:hello\0自己拷贝自己;hello我们找\0替换成h,下次又到\0又要用h来替换;造成了死循环!
3.1.2 strncat库函数的使用
1、用来追加任意长度的字符串
第一种情况:追加的长度 < 字符串本身的长度
第二种情况:追加的长度 > 字符串本身的长度
2、用来自己追加自己
1、相对于strcat库函数,strncat库函数更加的安全;strncat也拥有strcat的功能,而且比strcat更加的强大;可以自己追加自己的串!
2、如果字符串为hello:它的长度是5,如果我们拷贝3个长度,就是默认在拷贝3个字符以后默认加上\0;如果我们拷贝的长度>5,它拷贝完5个以后也会默认加上\0,终止拷贝!
3、strncpy和strncat的区别:
(1)strncpy拷贝的时候不会拷贝\0过去,但是strncat追加的时候会默认在后面补充\0;
(2)strncpy拷贝的长度>字符串本身长度时,多出来的元素个数会默认补充\0来填充凑数;但是strncat追加时不会强制填充,字符串长度追加完成后,直接补充\0,结束追加!
3.2 strcat库函数的模拟实现
方法1:
先找到第一个字符串的\0,找到以后就从\0开始追加;把第二个字符串的内容拷贝过来,包括\0 !
方法2:
我们发现对strcat函数的返回值也是一个char*指针,和strcpy库函数是一样的;而我们设计的是没有返回值;所以我们可以根据前面strcpy函数的模拟,也定义一个指针记住起始位置。最后返回这个指针就可以啦!