1.strtok
strtok是字符串分割函数
![]()
两个参数分别是char*和const char*,返回类型为char*。
第一个参数是要分割的字符串,第二个参数是被当作分隔符号的字符串
返回的是分割前的字符串的首字符的地址
分割成几段字符串调用几次函数,每次找到分隔符都将分隔符改为'\0'并记录位置以便下次调用函数寻找下一个分隔符,直到找到作为字符串结尾标志的'\0'返回NULL指针。
下面是strtok函数的调用
#include <stdio.h>
#include <string.h>
int main()
{
char str[] = "hello@boy.hh";
const char sep[] = "@.";
//因为要截成三段,所以调用三次函数
//至于第二次和第三次调用函数第一个参数变成了NULL是函数规定的
char* s1 = strtok(str, sep);//只找第一个标记
printf("%s\n", s1);
char* s2 = strtok(NULL, sep);//是从保存的好的位置开始继续往后找
printf("%s\n", s2);
char* s3 = strtok(NULL, sep);//是从保存的好的位置开始继续往后找
//最后是找到'\0'返回开始的位置的地址
printf("%s\n", s3);
return 0;
}
这样写虽然对,但略显笨拙,稍稍改进一下
char str[] = "hello@boy.hh";
const char sep[] = "@.";
for (char* s = strtok(str, sep); s != NULL; s = strtok(NULL, sep))
{
printf("%s\n", s);
}

2.strerror
strerror是返回错误信息字符串的函数
![]()
参数是int型的,类似于我们平时浏览器报错时显示的错误码:404 这样的
printf("%s\n", strerror(0));
printf("%s\n", strerror(1));
printf("%s\n", strerror(2));
printf("%s\n", strerror(3));

根据错误码会打印出不同的报错信息
strerror函数通常是和errno一起用的
errno是包含在errno.h中的全局变量,代表了错误码
#include <limits.h>
#include <errno.h>
#include <stdlib.h>
int main()
{
int* p = (int*)malloc(INT_MAX);//malloc向堆区申请内存
//申请成功返回申请到内存的首元素地址
//申请失败返回NULL指针
if (p == NULL)
{
printf("%s\n", strerror(errno));
return 1;//返回非零值表示程序非正常终止
}
//....
return 0;
}

而perror与strerror函数类似,perror会直接打印错误信息

函数参数没有什么实际意义,一般放字符串
int* p = (int*)malloc(INT_MAX);
if (p == NULL)
{
perror("Malloc");
return 1;
}

3.memcpy
memcpy是内存拷贝函数,与strcpy类似,strcpy只能拷贝字符串,memcpy可以拷贝任意类型的数据

第一个指针参数指针指向存放被拷贝内存
第二个指针参数指向要拷贝的内容
第三个无符号整形参数是要拷贝的字节数
返回第一个指针参数的地址
void*可以接受任何类型指针,也了可以转化为任意类型指针
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[5] = { 0 };
memcpy(arr2, arr1, sizeof(int) * 5);
拷贝之前:

拷贝之后:

但memcpy不能用来拷贝内存重叠的情况(在部分编译器中),因为编译器并未规定memcpy函数可以实现内存重叠的拷贝,虽然部分编译器memcpy可以实现,但最好还是不要轻易用,不然会导致可移植性变差
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
// 1 2 1 2 3 4 5 8 9 10
memcpy(arr1+2, arr1, 20);
//使用memcpy函数拷贝后可能不会出现预想的结果
4.memmove
memmove函数是专门用来应对拷贝内存重叠时的情况的
memmove函数与memcpy函数使用方法基本一致
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
memmove(arr1+2, arr1, 20);//可以实现重叠内存的拷贝
memmove(arr1, arr1+2, 20);//可以实现重叠内存的拷贝

一次memmove后
第二次memmove后
5.memcmp
![]()
指针参数1和指针参数2指向两部分要比较的内存
第三个无符号整型参数是要比较的字节数
如果buf1小于buf2返回小于0的值,具体值未定,一般返回-1
如果buf1等于buf2返回0
如果buf1大于buf2返回大于0的值,具体值未定,一般返回1

int arr1[] = { 1,2,3,4,5 };
int arr2[] = { 1,2,3,4,6 };
int ret = memcmp(arr1, arr2, sizeof(int) * 4);//比较前四个整形
printf("%d\n", ret);

int arr1[] = { 1,2,3,4,5 };
int arr2[] = { 1,2,3,4,6 };
int ret = memcmp(arr1, arr2, sizeof(int) * 5);//比较前5个整形
printf("%d\n", ret);

6.memset
memset函数是以字节为单位来初始化内存单元的

第一个指针参数指向要被初始化的内存
第二个整型参数是指向内存要被初始化的内容
第三个无符号整型参数是字节数
返回第一个指针参数
int arr[] = { 0x11111111,0x22222222,3,4,5 };
memset(arr, 9, 20);
memset前:

memset后:

本次分享结束,共勉!
本文详细介绍了C语言中的几个关键函数:strtok用于字符串分割,strerror返回错误信息字符串,memcpy进行内存拷贝,memmove处理内存重叠拷贝,memcmp用于比较内存块,以及memset用于初始化内存区域。这些函数在C语言编程中起着重要作用。
620

被折叠的 条评论
为什么被折叠?



