常见字符串函数和内存函数详解(二)【C语言】

目录

strtok函数

 strerror函数(了解就可以)

 字符分类函数:

isdigit函数

 内存函数:memcpy函数

memmove函数的模拟实现:


strtok函数

strtok函数是可以用分隔符来切割字符串的函数,它具有保存字符串的功能。

strtok函数找到str中的下一个标记,并将其用’\0'结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可以修改。

返回值:char*类型

 头文件:#include<string.h>

char * strtok ( char * str, const char * sep );

sep参数是个字符串,定义了用作分隔符的字符集合;比如

创建一个字符串     :             

char arr[ ] = "123456789@qq.com"

这个字符串中的@和 .  就是分隔符的集合   "@." 

sep就可以指向分隔符的集合,也可以说将字符串“@.”传给sep

而第一个参数str指定了一个字符串,它包含了0个或者多个由sep字符串中的一个或者多个分隔符分割的标记。就是说str其实是一个字符串,就是我们创建的arr

1、strtok函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok函数将保存他在字符串中的位置,这也就是他的保存功能。

 2、strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。

3、如果字符串中不存在更多的标记,则返回NULL指针。 

我们还是以 这个为例:

char arr[ ] = "123456789@qq.com";

const char* p=”@.“;

 第一次使用这个strtok函数时,他会将‘@’调换为‘\0’来返回首字符的位置,

strtok(arr,p);

但是再次调用strtok函数的时候,就不能使用arr了,我们要使用空指针NULL

strtok(NULL,p) ;

多说无益,上代码:

int main()
{
	char arr[] = "123456789@qq.com";
	char buf[200] = { 0 };
	strcpy(buf, arr);//这里用strcpy函数临时拷贝arr,因为strtok函数会改变被操作的arr字符串

	const char* p = "@.";
	char* str = strtok(buf, p);
	printf("%s\n", str);//第一次打印

	str = strtok(NULL, p);
	printf("%s\n", str);//第二次打印

	str = strtok(NULL, p);
	printf("%s\n", str);//第三次打印

	return 0;
}

运行结果:

 但是这样写代码冗余,我们可以简单优化一下,这里采用for循环的模式:

 strerror函数(了解就可以)

strerror函数是把错误码转化为错误信息

返回值:char*类型

 头文件:#include<string.h>

像浏览器出现的404也是错误码,在大学中选课的时候,网站崩掉时显示的也是错误码。

下面看一下使用示例:

int main()
{
	printf("%s\n", strerror(0));
	printf("%s\n", strerror(1));
	printf("%s\n", strerror(2));
	printf("%s\n", strerror(3));
	printf("%s\n", strerror(4));

	return 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任何可打印字符,包括图形字符和空白字符

 这些都是一些常用的

下面举几个例子:

isdigit函数

头文件时:#include<ctype.h>

isdigit函数是如果传进去的是非数字字符,它返回的就是0,如果传进去 的是数字字符,它返回的是非0字符。 

函数示例:传入非数字字符

int main()
{
	char ch = 'A';//'0' '1' '2' '3' .... '9'
	int ret = isdigit(ch);

	printf("%d\n", ret);

}

 运行结果:

 函数示例:传入是数字字符

int main()
{
	char ch = '2';//'0' '1' '2' '3' .... '9'
	int ret = isdigit(ch);

	printf("%d\n", ret);

}

运行结果:

 内存函数:memcpy函数

 memcpy函数是内存拷贝函数

返回值:void*类型

参数:有三个参数,第一个和第二个都是void* 类型,任何类型都可以传。第三个是size_t类型,也是unsigned int类型

,传的是字节数。 

 头文件:#include<string.h>

函数示例:

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[10] = { 0 };
	memcpy(arr2, arr, 20);

	
	return 0;
}

运行内存结果:

 

 我们可以看到在内存中已经将值传进去了。

模拟实现:

void* my_memcpy(void* dest, void* src, size_t num)
{
	void* ret = dest;
	assert(dest);
	assert(src);

	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,10 };
	int arr2[10] = { 0 };
	my_memcpy(arr2, arr1, 20);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr2[i]);
	}

	return 0;
}

运行结果:

memmove函数:

memmove函数是内存拷贝的函数,没有类型限制,但是memmove使用要考虑内存重叠问题

返回值:void*类型 

 头文件:#include<string.h>

memmove函数模拟实现: 

void* my_memmove(void* dest, void* src, size_t num)
{
	void* ret = dest;
	assert(dest);
	assert(src);

	if (dest < src)//1 前->后
	{
		while(num--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else //2 3 后->前
	{
		while (num--)
		{
			*((char*)dest + num) = *((char*)src + num);
		}
	}
	return ret;
}

int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	
	my_memmove(arr1+2, arr1, 20);


	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}


	return 0;
}

运行结果:

  • 19
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 30
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

日出等日落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值