strtok,strerror,memcpy,memmove,memset,memcmp函数的使用

本文详细介绍了C语言中的六个重要内存管理函数:strtok用于字符串分割,strerror返回错误信息,memcpy进行无重叠数据复制,memmove处理重叠内存,memset设置内存值,memcmp进行字节比较。这些函数在编程中常用于数据操作和错误处理。
摘要由CSDN通过智能技术生成

目录

​编辑

一、strtok

二、strerror

三、memcpy

四、memmove

五、memset

六、memcmp


一、strtok

char * strtok ( char * str, const char * sep);
1.sep参数指向⼀个字符串,定义了用作分隔符的字符集合 。
2.第⼀个参数指定⼀个字符串,它包含了0个或者多个由sep字符串中⼀个或者多个分隔符分割的标记。
3.strtok函数找到str中的下⼀个标记,并将其用 \0 结尾,返回⼀个指向这个标记的指针。
4.strtok函数的第⼀个参数不为NULL ,函数将找到str中第⼀个标记,strtok函数将保存它在字符串
中的位置。
5.strtok函数的第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标
记。
6.如果字符串中不存在更多的标记,则返回 NULL 指针。

 : strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串⼀般都是临时拷贝的内容 并且可修改。

#include <stdio.h>
#include <string.h>
int main()
{
	char arr[] = "192.abc.6@111";
	char* sep = ".@";//定义分割函数
	char* str = NULL;
	for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep))
	{//第一次循环会找到NULL,并将其标记为下一次循环的开头,所以for循环中的str的变化为(NULL,sep)。
	 //且只有第一次循环的开头不是NULL,for循环的初始化完美解决了这个问题
		printf("%s\n", str);
	}
	return 0;
}

 

二、strerror

char * strerror ( int x );

 strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。

:C语言中strerror放在头文件<errno.h>,中,使用前要包含头文件。

#include <errno.h>
#include <stdio.h>
#include <string.h>

int main()
{
	int i = 0;
	for (i = 0; i <= 5; i++) 
	{
		printf("%s\n", strerror(i));
	}
	return 0;
}

三、memcpy

void * memcpy ( void * destination, const void * start, size_t num );

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

:(1)memcpy在遇到\0时并不会停止复制。

       (2)如果start和destination有任何的重叠的部分,复制的结果都是未定义的。

#include <stdio.h>
#include <string.h>
int main()
{
	int a1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int a2[10] = { 0 };
	memcpy(a2, a1,4*sizeof(int) );//从a1上复制4个数到a2上
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", a2[i]);
	}
	return 0;
}

四、memmove

 void * memmove ( void * destination, const void * start, size_t num );

 与memcpy相比,memmove可以用来处理重叠的内存空间。

#include <stdio.h>
#include <string.h>
int main()
{
	int a1[] = { 1,2,3,4,5,6,7,8,9,10 };
	memmove(a1 + 2, a1, 4*sizeof(int));//将前4个数向后2个位置复制
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", a1[i]);
	}
	return 0;
}

 

五、memset

void * memset ( void * ptr, int x, size_t num );

memset将x中的值,以字节为单位,赋值给ptr。

#include <stdio.h>
#include <string.h>
int main()
{
	char ptr[] = "Hu Tao";
	memset(ptr, 'x', 3);//将ptr的前3个字节赋值为x
	printf(ptr);
	return 0;
}

六、memcmp

int memcmp ( const void * ptr1, const void * ptr2, size_t num );
memcmp⽐较从ptr1和ptr2指针指向的位置开始,向后的num个字节。如果ptr1>ptr2,则返回大于0的数,如果相等返回0,小于返回小于0的数。
:比较是一个字节一个字节的比较,如果前一个字节已经比较出结果,则直接返回值,不会再比较后面的字节。
#include <stdio.h>
#include <string.h>
int main()
{
	char ptr1[] = "HuTao NaXiDa";
	char ptr2[] = "HuTao FuNingNa";
	int n;
	n = memcmp(ptr1, ptr2, sizeof(ptr1));
	if (n > 0)
	{
		printf("%s更大", ptr1);
	}
	else if (n == 0)
	{
		printf("一样大");
	}
	else 
	{
		printf("%s更大", ptr2);
	}
	return 0;
}

  • 13
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值