c语言本身没有字符串,但是我们用字符串的频率也较为频繁,在c语言中我们一般把字符串放在字符数组或者常量字符串中,而这些常见的字符串函数用于那些可以修改的字符串数组中(而非常量字符串)
我们今天要介绍的函数分为几类
1.求字符串长度函数 strlen
size_t strlen ( const char * str );
strlen函数求出的是在\0之前的元素个数,属于比较简单的函数。
strlen的模拟实现
2.长度不受限制的字符串函数
strcpy char* strcpy(char * destination, const char * source );
strcat char * strcat ( char * destination, const char * source );
strcmp int strcmp ( const char * str1, const char * str2 );
这三个函数的模拟实现
3.长度受限制的字符串函数介绍
strncpy
strncat
strncmp
此三者与上述并无较大差异,唯一不同的在于,他们有长度限制,在传递参数的时候的n就是要对几个字节做出运算,正是因为他们有了一定长度的限制,他们的使用会更加的安全(比如不会出现数组访问越界的问题)
4.字符串查找函数
strstr char * strstr ( const char *str1, const char * str2);
他是用来在一个较长的字符串中找到目标字符串的函数,如果找到了,就返回其地址,如果没有找到则会返回一个空指针null
其模拟实现如下
5.字符串切片函数
strtok char * strtok ( char * str, const char * sep );
sep参数是个字符串,定义了用作分隔符的字符集合(也就是我们输入的以什么为界来切片)
第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标
记。
strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:
strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容
并且可修改。)
strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串
中的位置。
strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标
记。
如果字符串中不存在更多的标记,则返回 NULL 指针。
有人可能会问,为什么他传null指针就可以正常使用呐?虽然我们不知道编译器厂商到底是如何实现该函数的,但是我们可以大胆预测他用来static或者是将其指针存入寄存器中,这样就可以在下一次调用函数的时候实现其功能了
这个函数的调用规则有点奇怪,下面我们来描述一下他是如何使用最佳
(由于该函数会对原来的字符串进行修改,所以我们在使用之前,一般需要临时拷贝一份)
6.错误信息报告函数
strerror char * strerror ( int errnum );
返回值是错误码所对应的错误信息,由于我们的错误码都是一个数值,比如常见的404等等,而strerror就能将错误码转化为对应的错误信息,(错误码存放于寄存器中,他总是存放最近一次的错误码)
printf("%s’,strerror(errno));便能够很好的显示我们的错误信息了
而他其实还有替代方案
perror();这个就相当于上述的代码,当我们需要打印错误信息的时候就可以使用,而在只需要知道错误码,不需要输出的时候则可以选择strerror
7.memset内存函数
void * memcpy ( void * destination, const void * source, size_t num );
函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
这个函数在遇到 '\0' 的时候并不会停下来。
如果source和destination有任何的重叠,复制的结果都是未定义的。
memset的模拟实现
memmove
void * memmove ( void * destination, const void * source, size_t num );
和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
如果源空间和目标空间出现重叠,就得使用memmove函数处理。
memmove的模拟实现
memcpy的模拟实现
memcmp
int memcmp ( const void * ptr1,const void * ptr2,size_t num );
比较从ptr1和ptr2指针开始的num个字节
如果第一个比第二个大,返回正数;如果相等,返回0;如果第一个比第二个小,返回负数,
其模拟过程与strcmp基本一致,这里不再赘述
由此,我们简单的概述了几种常见的字符串函数和内存函数的模拟实现,希望能够对大家的c
语言入门学习有所帮助