紧接上回我们最后模拟实现了strstr(没有看过1的小伙伴可以去看一下), 接下来我要讲的便是strtok函数的使用。
delimiters参数指向的是一个字符串,定义了用作分割符的字符集合。
第一个参数指定一个字符串,它包含了0个或多个由delimiters字符串中一个或多个标记。
strtok函数找到str中的下一个标记,并将其用\0结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改)。
strtok函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
如果字符串中不存在更多的标记,则返回NULL指针。
接下来给大家实际举例一下:
为什么能这样去写呢?因为for循环的初始化部分只执行一次。
strerror函数的使用
首先我们来看它的参数:
那么它可以做什么呢,strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。所以errnum参数部分传的是一个错误码。
在不同的系统和C语言标准库的实现中都规定了一些错误码,一般是放在errno.h这个头文件中说明的,C语言程序启动的时候就会使用一个全局的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表示没有错误,当我们在使用标准库中的函数得时候发生了某种错误,就会将对应的错误码,存放在errno中,而一个错误码的数字是整数很难理解是什么意思,所以每一个错误码都有对应的错误信息。strerror函数就可以将错误对应的错误信息字符串的地址返回。
那它只能这样用吗?当然不是。
在这里例子中用到了C语言的文件操作我会在下一期的博客中讲。到这里相信大家对strerror这个函数有了一定的了解,学习了这个函数我们也可以了解perror函数,它相当于把上面例子中的打印函数完成了,直接将错误信息打印出来。
perror函数打印完参数部分的字符串后,再打印一个冒号和一个空格,在打印错误信息。
到这字符函数和字符串函数的学习就完了希望这些知识对大家有一定的帮助。
C语言内存函数
1.memcpy使用和模拟实现
它的三个参数分别表示目的地,源头,要复制的字节数。它们都是void*,那为什么呢?原因就是你在使用memcpy函数中你可能会用它拷贝整形数据,字符数据,结构体数据......。
这就是整型数组的拷贝,那我们要是想上面代码中的45678呢?
这里改变的便是源头,我们知道数组名表示的是首元素的地址要拷贝45678的话首元素的地址加3就可以了。
这个就是字符数组的拷贝。
总结一下:
函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。
这个函数在遇到\0的时候不会停下来。
如果source和destination有任何重叠,复制的结果都是未定义的。
关于memcpy函数的模拟实现
这就是它的模拟实现。
补充一下上面的代码。
2.memmove使用和模拟实现
和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
如果源空间和目标空间出现重叠,就得使用memmove函数处理。
模拟实现
我们是如何实现的呢?
首先我们先从前往后拷贝看,如果我要把12345拷贝到34567上面去就是1-3,2-3然后34变成了12最后就变成上面实现的结果。如果要把56789拷贝到34567上就得用从后向前的方法,就是9-7,8-6然后67变为89。当然如果dest和src没有重叠的话就都可以。
3.memset函数的使用
memset--内存设置
ptr指设置内存要从哪块开始,value指你要设置的值是什么,num指字节。下面就是它的使用:
值得注意的是memset在设置的时候是以字节为单位来设置的。
4.memcmp函数的使用
比较从ptr1和ptr2指针指向的位置开始,向后的num个字节。
到这字符函数与字符串函数就算写完了,如果有问题的地方希望大家能够指出来。