strtok字符串操作函数和内存操作函数

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

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后:

 本次分享结束,共勉!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值