strtok
1.del参数是字符串,定义了用作分隔符的字符集合 2.第一个参数指定一个字符串,它包含0个或者多个由del字符集合 中一个或者多个分隔符的标记 3.strtok函数找到str中的第一个标记,并将其用'\0'结尾, 返回一个指向这个标记的指针(strtok函数会改变被操作的字符串, 在使用strtok函数切分的字符串一般都是临时拷贝的内容 4.strtok函数的一个参数不为NULL,函数将找到str中第一个标记,strtok 函数将保存它在字符串中的位置 5.strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置 开始,查找下一个标记 6.如果字符串中不存在更多的标记,则返回NULL指针
strtok函数的使用
#include<stdio.h> #include<string.h> int main() { const char* del = "@."; char arr[] = "2841460969@qq.com"; char ch[20] = { 0 }; strcpy(ch, arr); char* ret = NULL; for (ret = strtok(ch, del); ret != NULL; ret = strtok(NULL, del)) { printf("%s\n", ret); } return 0; }
错误信息报告
strerror
返回错误码所对应的错误信息
C语言的库函数,在执行失败时都会设置相应的错误码
例如
#include<stdio.h> #include<string.h> int main() { printf("%s\n", strerror(0)); printf("%s\n", strerror(1)); printf("%s\n", strerror(2)); printf("%s\n", strerror(3)); return 0; }
实例
errno是C语言设置的全局的错误码存放的变量
#include<stdio.h> #include<string.h> #include<errno.h> int main() { FILE* p = fopen("test.c", "r"); if (p == NULL) { printf("%s\n", strerror(errno)); } return 0; }
由运行结果可知,文件test.c存在
内存操作函数
memcpy-内存拷贝
1.函数memcpy从source的位置开始向后复制num个字节的数据到destination 的内存位置 2.函数在遇到'\0'时并不会停下来 3.如果source和destination有任何的重叠,复制的结果都是未知的
模拟实现memcpy
#include<stdio.h> #include<assert.h> void* my_memcpy(void* dest, const void* src, int num) { assert(dest && src); void* ret = dest; while (num--) { *(char*)dest = *(char*)src; dest = (char*)dest + 1; src = (char*)src + 1; } return ret; } int main() { int arr1[] = { 1,2,3,4,5,6,7,8,9 }; int arr2[10] = { 0 }; my_memcpy(arr2, arr1, 20); return 0; }
memmove-可处理重叠的内存拷贝
1.与memcpy的差别是memmove函数处理的源内存块和目标内存块是可以重叠的 2.如果源空间和目标空间出现重叠,需要使用memmove函数进行处理
模拟实现memmove函数
当dest<src时,情况1 需要从前往后拷贝数据 当src<dest<src+size_num 情况2 从后往前或者从前往后均可拷贝 当src+size_num<dest 情况3 需要从后往前拷贝数据
#include<stdio.h> #include<assert.h> void* my_memmove(void* dest, const void* src, int num) { assert(dest && src); void* ret = dest; //从前往后拷贝 if (dest < src) { while (num--) { *(char*)dest = *(char*)src; dest = (char*)dest + 1; src = (char*)src + 1; } return ret; } //从后往前拷贝 else { while (num--) { *((char*)dest + num) = *((char*)src + num); } } } int main() { int arr[] = { 1,2,3,4,5,6,7,8,9 }; int sz = sizeof(arr) / sizeof(arr[0]); my_memmove(arr + 2, arr, 20); int i = 0; for (i = 0; i < sz; i++) { printf("%d ", arr[i]); } return 0; }
memcmp-内存数据比较
1.比较从ptr1和ptr2只在开始的第num个字节 2.若ptr1指向的字节内容比ptr2指向的字节内容小,返回小于0的变量 若ptr1指向的字节内容和ptr2指向的字节内容相等,则继续向后比较 若ptr1指向的字节内容比ptr2指向的字节内容大,返回大于0的变量