C语言常见的字符函数

一、C语言中常见的字符函数

二、strcmp函数以及其模拟实现

strcmp函数的演示

在这里插入图片描述

//一、比较两个字符串,前面的字符串和后面的字符串,进行字典序比较
	int ret = strcmp("abcdef", "abq");
	printf("%d", ret);
	if (ret > 0)//返回值大于0,前字符串比后大
	{
		printf(">");
	}
	else if(ret==0)//等于0,相等
	{
		printf("==");
	}
	else//剩下小于
	{
		printf("<");
	}

运行结果:
在这里插入图片描述

上述代码中,两个字符串进行比较,在比较第三个元素的过程中,'c’比’q’的Ascii码值小,因此strcmp返回值<0.

strcmp函数模拟实现

my_strcmp(const char* s1, const char* s2) 
{
	assert(s1!=NULL);//确保传过来的地址不为空指针
	assert(s2 != NULL);
	while (*s1 == *s2)//如果比较的元素相等,则进入循环实现s1++,s2++将字符数组遍历
	{
		if (*s1 == '\0')//两个字符串在比较过程中一直处于相等状态,那就返回0
		{
			return 0;
		}
		s1++;//遍历数组
		s2++;//遍历数组
	}
	if (*s1 > *s2)//当比较过程中s1中的元素比s2大,则返回大于0的值
	{
		return 1;
	}
	else//当比较过程中s1中的元素比s2小,则返回大于0的值
	{
		return -1;
	}
}
	int ret = my_strcmp("abcdef", "abq");
	printf("%d", ret);

三、strncpy函数

在这里插入图片描述
strncpy函数的作用是,将源头字符串复制给目标字符串。第三个参数传的是需要拷贝的大小。

	char arr1[10] = "xxxxxxxxxx";
	char arr2[] = "ab";
	strncpy(arr1, arr2, 5);

这是代码经过调试的结果,需要复制五个字节大小的字符到arr1
中,但是arr2大小只有3个字节。这种情况下超出的字节用’\0’补齐。
在这里插入图片描述

四、strncat函数

作用是连接字符串,而使用strncat函数可以自定义连接字符串的长度。
在这里插入图片描述

	char arr1[20] = "abc\0xxxxxxxxxxx";
	char arr2[] = "def";
	strncat(arr1, arr2, 5);//arr1是目的追加字符串,从目的追加字符串的\0字符开始追加。若arr2中字符个数小于追加数n,则追加够为止。

函数调试过程:
在这里插入图片描述

五、strstr函数

strstr函数的演示

作用:strstr函数。在一个字符串中查找另一个字符串。
在这里插入图片描述

	char arr1[] = "abcdefabcdef";
	char arr2[] = "def";
	char* ret = strstr(arr1,arr2);
	printf("%s", ret);

程序运行结果:
在这里插入图片描述
因此strstr函数返回的是’d’的地址,通过地址我们可以打印d以后的字符串。

strstr函数的模拟实现

实现逻辑:
在这里插入图片描述

const char* my_strstr(const char* str1, const char* str2)
{
	assert(str1);
	assert(str2);
	const char* s1 = str1;//因为strstr实现的过程中要遍历字符数组,所以初始地址尽量不能改变,采用一个变量存储初始地址值,这里作用是存储目标地址
	const char* s2 = str2;//存储源头字符串地址。
	const char* cp = s1;
	if (*s2 == '\0')//如果源头字符串,是‘\0’则不用寻找直接返回
	{
		return s1;
	}
	while (*s1)//s1是用来存放可能匹配成功字符的地址。
	{
		cp=s1;//cp用来遍历可能成功的字符串数组。
		while (*cp == *s2 && *cp && *s2)//当两地址指向字符相等,而且指向字符不为‘\0’时候进入循环
		{
			cp++;//遍历str1的过程
			s2++;//遍历str2的过程
			if (*s2 == '\0')//若遍历过程中s2=='\0'则代表str2所指向的字符串在str1中可以找到,返回此时可能成功匹配的地址。
			{
				return s1;
			}
		}
		s1++;//不能成功匹配,切换到下一个可能成功的地址
		s2 = str2;//指向str2最初地址,为下一次循环匹配做准备
	}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值