常见的字符串函数和内存函数的模拟实现

        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

语言入门学习有所帮助

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值