一、字符串
在c语言中是没有字符串类型的,并且字符串这种类型处理起来是非常繁琐的,字符串一般是放在常量字符串中的或者字符数组中,所以这里一般是引用库函数去使用字符串函数中,今天这篇文章中,将介绍几个常用的函数,如:strlen、strcpy、strcat、strcmp等等。
二、字符串函数介绍以及使用
1、strlen
size_t strlen ( const char * str );
求字符串的长度,这个函数的用法是以'\0'为结束标志,返回的是'\0'前面的字符个数,不包含'\0',所指向的字符串必须包含'\0',返回的函数是size_t是无符号的,这个一定要注意。
如上图是strlen函数的使用,好了,会使用stren这个函数了,根据他的原理可以写出来一个自己的求字符串函数了。根据查看字符串'\0',把字符串的首元素地址传递进my_strlen这个函数中,用str1去接受字符串的首元素地址,然后利用断言assert去判断这个字符串是不是空地址,然后在进行判断字符串中字符的数量,在最后去返回字符的数量。
2、strcpy
char* strcpy(char * destination, const char * source );
这个函数是将source里面的数据拷贝到destination的空间中,但是一定要注意目标空间也就是destination中的空间充足,而且源空间也必须是以'\0'为结束标志,而且还要把'\0'复制到目标空间,在返回目标空间的首元素地址。
接着我们来实现自己写的strcpy的模拟实现,首先还是接收传进函数中的两个字符串数组的首元素地址,然后进行断言判断,在循环进行把源空间里面的数据传递到目标空间中,最后再把目标空间首元素的地址返还回去。
3、strcat
char * strcat ( char * destination, const char * source );
这个函数的用法就是把源空间里面的数据追加在目标空间后面,但是还是以'\0'为标志,追加的位置是在目标空间的'\0'后面,并且源空间的数据也是以'\0'为结束标志,并且目标空间的空间必须足够大。
一如上文所示,我将再次根据这个函数的原理去模拟实现一个自己的函数,首先还是先把数据地址进行传递,紧接着就是用断言函数进行判断,这里和上文都是一样的用const去修饰源空间,以防更改源空间的数据,然后在进行判断追加,,首先是用while函数进行把目标空间的数据地址先++到'\0'的地址,然后再把源空间的数据放入目标空间的地址,追后在返回首元素的地址。
4、strcmp
int strcmp ( const char * str1, const char * str2 );
这个函数就是判断字符串的大小,首先去根据两个字符串的首元素地址的数据向后一个个去判断,也就是相当于判断当前字符的ASCLL码的数据大小。当第一个字符串的小于第二个字符串时返回小于0的数值,相等就是返回0,第一个字符串大于第二个字符串时返回1。
然后接着就是模拟实现了,这个比上面的函数模拟实现要麻烦一点,首先还是assert断言去判断的两个字符串的地址,这里是利用while函数去判断两个字符串,循环是两个字符串相等时,判断字符串是否等于'\0',相等就返回0,不相等地址就+1,直到不相等时,首先判断str1是否大于str2,如果大于的话就返回1,否则就返回-1。
5、strstr
char * strstr ( const char *, const char * );
这个函数是查找后面的字符串是否是前面字符串的子串,并且返还从这个子串以及后面的字符串。
这个模拟实现有点麻烦,不过还是先把两个字符串传递到自定义的函数中,还是先断言,然后把两个字符串的地址先传给两个变量也就是s1和s2,再把str1的地址传递给cur,这个s1和s2是去判断str2字符串是否是str1的子串,cur是为了排除掉子串前面的字符,如果没有cur++,就是为了跳过前面的字符串,如果两个字符串的首字符字符相等后就进入while函数,两个字符串的地址开始++进行判断是否是子串,如果是就返回这时子串在第一个字符串的第一次出现的地方的地址,如果不是就返回NUll。
6、 strtok
char * strtok ( char * str, const char * sep );
这个函数大概就是分割, 第一个参数就是指向的字符串,这个字符串一般包含很多的分隔符,而且第一个函数不会时空指针,后面的就是分隔符,可以是“,”也可以是“-”等具体实现如下图。
如上图就是以".,-"这三个为切割符去切割这个字符串的。
7、strerror
char * strerror ( int errnum );
strerror就是播报错误的一个字符串函数,返回当前错误信息。应为编译器报错的一般都是错误代码,我们是看不懂的,所以就需要一个函数去输出转换成我们所能看懂的信息。
注意的是必须要包含头文件,也就是下面这个头文件。
#include <errno.h>
使用体现如下图,errno就是报告的错误代码。
8、memcpy
void * memcpy ( void * destination, const void * source, size_t num );
这个函数的组要用法就是从source的位置复制num个字节数据放到destination,这个函数与strcpy的不同处就是它遇到”\0“并不会停止,如果source和destination有任何的重叠,复制的结果都是未知的。
好了 我们就可以接着用自己的代码去实现这个函数了,首先把两个字符串传递过去,以及所需要赋值的字节数,然后进行断言判断两个字符串是否是空指针,然后进行while循环,每执行一次num就减减,也就是剩下的字节数,然后再把需要传递的字符串进行传递过去,在加加,因为我们传递的可能不止是字符串,所以就把他强转成字符型指针,这样就算别的类型也可以进行传参。
9、memmove
void * memmove ( void * destination, const void * source, size_t num );
这个函数和memcpy区别不大,就是目标空间出现重叠时就使用这个函数,它可以处理目标空间重叠的传递。如图就复制在hello后面了,把空格顶掉。