一、strtok函数
strtok函数函数的功能:将字符串拆分为标记
strtok函数的使用:
int main() { char* p = "23545362421@qq.com"; const char* sep = ".@"; char arr[30]; char* str = NULL; strcpy(arr, p);//将数据拷贝一份,处理arr数组的内容 for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep)) { printf("%s\n", str); } }
注意:
- sep参数是个字符串,定义了用作分隔符的字符集合
- 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标 记
- strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注: strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容 并且可修改)
- strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串 中的位置
- strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记
- 如果字符串中不存在更多的标记,则返回 NULL 指针
二、strerror函数
strerror函数的功能:返回错误码,所对应的错误信息
使用strerror函数要引头文件
#include <erron.h>
strerror函数的使用:
int main() { FILE* pf = fopen("date.txt", "r"); if (pf == NULL) { //printf("%s\n", strerror(errno)); perror("fopen") return 1; } return 0; }
报错的是程序运行过程中的运行的错误
三、memcpy函数
3.1memcpy函数的认识
memcpy函数的功能:将字节数的值从源指向的位置直接复制到目标指向的内存块
注意:
- 这个函数在遇到 '\0' 的时候并不会停下来
- 如果source和destination有任何的重叠,复制的结果都是未定义的
使用memcpy函数要引头文件
#include <string.h>
memcpy函数的使用
int main() { int arr1[5] = { 0 }; int arr2[] = { 1,2,3 }; memcpy(arr1, arr2, 12); int i = 0; for (i = 0; i < 5; i++) { printf("%d ", arr1[i]); } }
可以拷贝整型,也可以拷贝浮点型,所以用void*来接收
memcpy函数是用来处理不重叠的内存拷贝的
3.2memcpy函数的模拟实现
#include <stdio.h> #include <string.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[5] = { 0 }; int arr2[] = { 1,2,3 }; my_memcpy(arr1, arr2, 12); int i = 0; for (i = 0; i < 5; i++) { printf("%d ", arr1[i]); } }
注意:强制类型转化是临时的
四、memmove函数
4.1memmove函数的认识
memmove函数的功能:将字节数的值从源指向的位置复制到目标指向的内存块。允许目标和源重叠。
注意:
为避免溢出,目标参数和源参数指向的数组的大小应至少为字节数
如果源空间和目标空间出现重叠,就得使用memmove函数处理
使用memmove函数要引头文件
#include <string.h>
memmove函数的使用
int main() { int arr[10] = { 0,1,2,3,4,5,6,7,8,9 }; memmove(arr + 2, arr, 20); int i = 0; for (i = 0; i < 10; i++) { printf("%d ", arr[i]); } return 0; }
4.2memmove函数的模拟实现
这样拷贝下去和我们想要的结果不同,所以我们就从后向前拷贝
src在dest前面时:后-->前
src在dest后面时:前-->后
#include <stdio.h> #include <string.h> #include <assert.h> void* my_memmove(void* dest, const void* src, int num) { assert(dest && src); char* ret = dest; if (dest < src) { //前->后 while (num--) { *(char*)dest = *(char*)src; dest = (char*)dest + 1; src = (char*)src + 1; } } else { //后->前 while (num--) { *((char*)dest + num) = *((char*)src + num); } } return ret; } int main() { int arr[10] = { 0,1,2,3,4,5,6,7,8,9 }; my_memmove(arr + 2, arr, 20); int i = 0; for (i = 0; i < 10; i++) { printf("%d ", arr[i]); } return 0; }
五、memcmp函数
5.1memcmp函数的认识
memcmp函数的功能:比较从ptr1和ptr2指针开始的num个字节
使用memcmp函数要引头文件
#include <string.h>
memcmp函数的使用:
int main() { int arr1[] = { 1,2,1,5,4 }; int arr2[] = { 1,2,257 }; int ret = memcmp(arr1, arr2, 9); printf("%d\n", ret); return 0; }
两个数组的前九个字节是都是相同的,,所以返回0
5.2memcmp函数的模拟实现
#include <stdio.h> #include <string.h> #include <assert.h> int my_memcmp(const void* s1, const void* s2, int num) { assert(s1 && s2); char* str1 = (char*)s1; char* str2 = (char*)s2; int i = 0; for (i = 0; i < num; i++) { if (*(str1 + i) != *(str2 + i)) { return (*(str1 + i) - *(str2 + i)); } } return 0; } int main() { int arr1[] = { 1,2,3,5,4 }; int arr2[] = { 1,2,257 }; int ret = my_memcmp(arr1, arr2, 9); printf("%d\n", ret); return 0; }
六、memset函数
memset函数的功能:把ptr指向的前num个字节设置为value值
使用memcset函数要引头文件
#include <string.h>
memset函数的使用:
int main() { char arr[] = "hello word"; memset(arr, 'x', 5); printf("%s\n", arr); return 0; }
注意:
- 要设置的值。该值作为 int 传递,但该函数使用此值的无符号char转换填充内存块
- 以字节为单位来设置
将数组每个元素变为1是做不到的
七、字符分类函数
使用字符判断函数要引头文件
#include <ctype.h>
判断为真返回非0的数,判断为假返回0
函数 | 如果他的参数符合下列条件就返回真 |
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 | 任何可打印字符,包括图形字符和空白字符 |
八、字符转换函数
int tolower ( int c ); 大写--->小写
int toupper ( int c ); 小写--->大写
int main() { char str[20] = { 0 }; gets(str); char* p = str; while (*p) { if (isupper(*p)) *p = tolower(*p); p++; } printf("%s\n", str); return 0; }
本次的内容到这里就结束啦。希望大家阅读完可以有所收获,同时也感谢各位读者的支持。文章有问题可以在评论区留言,博主一定认真认真修改,以后写出更好的文章。