C语言——字符串函数(2)和内存函数

(一)strtok函数

C语言——字符串函数(2)和内存函数_第1张图片

dilimiters参数是个字符串,定义了用作分隔符的字符集合

第一个参数指定一个字符串,它包含了0个或者多个由dilimiters字符串中一个或者多个分隔符分割的标记。

strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)

strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。

strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。如果字符串中不存在更多的标记,则返回 NULL 指针。

strtok函数的应用

C语言——字符串函数(2)和内存函数_第2张图片
C语言——字符串函数(2)和内存函数_第3张图片
C语言——字符串函数(2)和内存函数_第4张图片
C语言——字符串函数(2)和内存函数_第5张图片
C语言——字符串函数(2)和内存函数_第6张图片

如果分隔符太多,难道我们要一直写下去吗?不防我们换一种写法,特别巧妙!

C语言——字符串函数(2)和内存函数_第7张图片
C语言——字符串函数(2)和内存函数_第8张图片

常巧妙!

(二)strerror函数

C语言——字符串函数(2)和内存函数_第9张图片

返回错误码,所对应的错误信息。

C语言——字符串函数(2)和内存函数_第10张图片
C语言——字符串函数(2)和内存函数_第11张图片

错误码翻译成错误信息。

C语言——字符串函数(2)和内存函数_第12张图片
C语言——字符串函数(2)和内存函数_第13张图片
C语言——字符串函数(2)和内存函数_第14张图片

但在我们路径底下没有相应文件,自然是打开失败,所以会报错误信息。

当我在对应路径底下创建了对应文件

C语言——字符串函数(2)和内存函数_第15张图片

当我打开还是错误的,为什么呢?

因为我们还没有把文件名扩展开,一般电脑文件后缀名都是隐藏着的,那怎么打开呢?

C语言——字符串函数(2)和内存函数_第16张图片

当我们打开文件扩展名才会显示文件名所有后缀。

C语言——字符串函数(2)和内存函数_第17张图片
C语言——字符串函数(2)和内存函数_第18张图片

这次就不会报什么错误信息了,说明对应路径底下存在文件,我们打开了文件并关闭了。

还有个与它类型类似的函数perror

C语言——字符串函数(2)和内存函数_第19张图片
C语言——字符串函数(2)和内存函数_第20张图片

它会自动在后面打出错误信息。

perror==printf strerror

C语言——字符串函数(2)和内存函数_第21张图片

(三)memcpy函数

C语言——字符串函数(2)和内存函数_第22张图片

https://legacy.cplusplus.com/reference/cstring/memcpy/?kw=memcpy

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

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

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

C语言——字符串函数(2)和内存函数_第23张图片
C语言——字符串函数(2)和内存函数_第24张图片
C语言——字符串函数(2)和内存函数_第25张图片
C语言——字符串函数(2)和内存函数_第26张图片

memcpy函数的返回类型是void*指针,因为memcpy设计者,不知道程序员使用memcpy拷贝什么类型的的数据,void*指针——通用类型指针,可以接受任意类型数据的地址。但是:这种类型指针不能直接解引用加减运算!

memcpy模拟实现函数

C语言——字符串函数(2)和内存函数_第27张图片
C语言——字符串函数(2)和内存函数_第28张图片
C语言——字符串函数(2)和内存函数_第29张图片

dest=(char*)dest+1 可以写出((char*)dest)++吗? src=(char*)src+1 可能可以但会出错。

C语言——字符串函数(2)和内存函数_第30张图片
C语言——字符串函数(2)和内存函数_第31张图片

但结果怎么跟我们的预想不一样呢?

C语言——字符串函数(2)和内存函数_第32张图片
C语言——字符串函数(2)和内存函数_第33张图片

(四)memmove函数

C语言——字符串函数(2)和内存函数_第34张图片

https://legacy.cplusplus.com/reference/cstring/memmove/?kw=memmove

和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。

如果源空间和目标空间出现重叠,就得使用memmove函数处理。

C语言——字符串函数(2)和内存函数_第35张图片
C语言——字符串函数(2)和内存函数_第36张图片

memmove模拟实现函数

C语言——字符串函数(2)和内存函数_第37张图片
C语言——字符串函数(2)和内存函数_第38张图片
C语言——字符串函数(2)和内存函数_第39张图片
C语言——字符串函数(2)和内存函数_第40张图片
C语言——字符串函数(2)和内存函数_第41张图片
C语言——字符串函数(2)和内存函数_第42张图片
C语言——字符串函数(2)和内存函数_第43张图片
C语言——字符串函数(2)和内存函数_第44张图片

换种测试方法

C语言——字符串函数(2)和内存函数_第45张图片
C语言——字符串函数(2)和内存函数_第46张图片
C语言——字符串函数(2)和内存函数_第47张图片

因为数组的地址是从低地址到高地址存放的,所以我们将目的地指针与源头指针比较,就能实现从前->后 或者从后->前的交换方式,分成区间来解决,完美模拟了memmove函数的实现。

(五)memcmp函数

C语言——字符串函数(2)和内存函数_第48张图片
C语言——字符串函数(2)和内存函数_第49张图片
C语言——字符串函数(2)和内存函数_第50张图片

跟strcmp的返回值相似。

那如果我们比较17个字节谁大呢?

C语言——字符串函数(2)和内存函数_第51张图片
C语言——字符串函数(2)和内存函数_第52张图片

明显arr2大,为什么呢?

因为VS是小端存储模式

arr1内存存储是 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00

arr2内存存储是 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 06 00 00 00

第17个字节是05与06的比较,自然arr2大,所以返回-1。

(六)memset函数

C语言——字符串函数(2)和内存函数_第53张图片
C语言——字符串函数(2)和内存函数_第54张图片
C语言——字符串函数(2)和内存函数_第55张图片

memset函数在修改的时候是以字节单位修改的。

C语言——字符串函数(2)和内存函数_第56张图片
C语言——字符串函数(2)和内存函数_第57张图片

所以给数组初始化是一个一个字节初始化,40字节就是10个010101。不能用来初始化数组。

你可能感兴趣的:(c语言,开发语言)