字符串函数与内存函数

一 、strtok函数

它的功能是将一个字符串按照分隔符分解成为多个字符串,下面是它的函数声明

char * strtok ( char * str, const char * sep );

》第一个形参是是需要分隔的字符串。

》第二个形参是存放分隔符的字符串。

下面让我们来认识一下如何使用strtok,使用之前先了解一下strtok的一些基本内容:

》strtok函数会寻找str字符串中的分隔符,并且把它转换为'\0',然后返回一个指向该标记的指针

(注: strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容 并且可修改。)

》如果strtok中函数的第一个参数不是空指针,函数将找到str中第一个分隔符,并将其的位置保存在函数中。

》若干strtok函数的第一个参数为空指针,函数将从被保存的位置开始寻找下一个分隔符,若没有分隔符,则返回空指针。

下面是演示代码与运行结果:

 

 这里重点解释一下代码中的for循环:

这里运用了for循环的初始化只进行一次的原理达到了循环

str=strtok(arr,sep);

str=strtok(NULL,sep);

str=strtok(NULL,sep);

str=strtok(NULL,sep);

........

的目的

二、 strerror

它的功能是返回错误码所对应的错误信息,下面是它的函数声明。

char * strerror ( int errnum );

#include //必须包含的头文件

下面是演示代码与运行结果:

 这个很简单就不过多赘述了,我们来看下一个知识点

三、字符串分类函数

下面是各种字符串分类函数:

》函数 如果它的参数符合下列条件就返回真
 iscntrl 任何控制字符
 isspace 空白字符:空格‘ ’,换页‘\f’,换行'\n',回车'\r',制表符'\t',或垂直制表符'\v'
 isdigit 十进制数字0~9
 isxdigit 十六进制数字,包括所有十进制数字,小写字母a~f,大写字母A~F
 islower 小写字母a~z
 isupper 大写字母A~Z
 isalpha 字母a~z或A~Z
 isalnum 字母或数字a~z,A~Z或0~9
 ispunct 标点符号,任何不属于数字或字母的图像字符(可打印符号)
 isgraph 任何图像字符
 isprint 任何可打印字符,包括图像字符和空白字符

使用非常简单,下面是参考代码(用于计算字符串中数字个数):

 

接下来两个知识点是本章内容最重要的两部分

 四、 memcpy函数

它的功能是从源内存的起始地址拷贝若干个字节到目标内存的地址中,下面是它的函数声明:

void * memcpy ( void * destination, const void * source, size_t num );

由于设计者不知道用户要传的形参类型和返回值类型,所以都设置成了void*类型的指针

》第一个形参是目标内存的地址。

》第二个形参是要被拷贝的内存地址。

》第三个形参是需要拷贝的字节大小。

先来了解一下memcpy的基本内容:

》函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。

》这个函数在遇到 '\0' 的时候并不会停下来。

》如果source和destination有任何的重叠,复制的结果都是未定义的。

下面是如何使用memcpy的代码:

 

 了解完memcpy如何使用,让我们来学习如何模拟实现memcpy

 这里重点讲一下while循环第一二行代码:

》第一行由于dst与src是void*类型的指针,这里我们需要转换为char*类型

》这里不能直接使用dst++,会出现如下错误(因为此时dst仍然为void*类型)

五、memmove函数

函数声明:int memcmp ( const void * ptr1, const void * ptr2, size_t num ); 

它的功能与memcpy基本相同,但是memmove在拷贝内存是,是可以重叠的,而memcpy不可以

下面是如何使用memmove的代码:

 

 下面我们来对memmove函数进行模拟实现

我们先看下面这幅图,要实现内存重叠时候的拷贝,有两种不同的拷贝方式:

》 当dest的地址小于src的地址时,应该从前到后拷贝(即先把3拷贝到1中去)

》当dest的地址大于等于src的地址时应该从后向前拷贝

于是有了以下代码:

 以上就是本章所有内容啦,你学会了吗?

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值