字符串和内存函数(1)

本文详细介绍了C语言中的字符串操作函数,包括strcat用于字符串拼接、strcmp用于比较字符串、strncpy和strncat处理字符数限制、ctrncmp限定字符数比较,以及strstr用于查找子串。这些函数在编程中具有重要作用,确保了字符串处理的灵活性和准确性。
摘要由CSDN通过智能技术生成

目录

strcat函数

 strcmp函数

strncpy函数

strncat函数

 ctrncmp函数

 strstr函数


 

strcat函数

如上图,strcat函数就是将一个字符串拼接在另一个字符串后面,第一个参数是目标字符串,第二个参数是源字符串,strcat的返回值是目标字符串的起始地址。

注意:1.目标空间必须足够大,还需要可以修改。

           2.目标空间必须得有\0(保证能找到目标空间的末尾)

           3.原字符串中也得有\0,在拷贝时将源字符串中的\0也拷贝过去。

如下图,准备拷贝时在目标字符串第一个\0的位置就开始拷贝。

下方代码是模拟实现strcat函数,请读者自行理解。

char* my_strcat(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest && src);
	//找到目标空间的末尾
	while (*dest != '\0')
		dest++;
	//数据追加
	while (*dest++ = *src++);
	return ret;
}

 strcmp函数

如上图,strcmp函数是用来比较两个字符串相对位置的字符的ASCII的大小的,如果相对位置的大小相同,就往后一位比较,直到有大小不同的字符就停止比较。

返回值如下:1.当参数1大于参数2,返回大于0的数。

                      2.当参数1等于参数2,返回0。

                      3.当参数1小于参数2,返回小于0的数。

下方是模拟strcmp函数的实现。

int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	if (*str1 > *str2)
		return 1;
	else
		return -1;
}

strncpy函数

 如上图,strncpy函数比strcpy函数多了一个参数,参数3是指参数2字符串拷贝的字符个数,在拷贝时,不会将参数2字符串末尾的\0拷贝过去。如果参数3的个数超过参数2的字符个数会发生什么呢?

 如上图,超过的部分会自动补\0,所以最终只会打印abc。

strncat函数

如上图,strncat函数的参数3跟strncpy的参数3类似,都是指个数,不过在拷贝时,会自动拷贝一个\0在末尾。

 ctrncmp函数

如上图, strncmp的参数3也是指个数,指的是两个字符串前num个相对位置的字符的大小,因为前三个字符都一样,所以返回值是0。

当个数是4时,前3个字符的大小一样,比较的就是d和q,q比d大,就返回小于0的数。

 strstr函数

strstr会返回str1中str2第一次出现的位置,如果str1中没有str2,就返回NULL。strstr是一个在字符串中找字符串的函数。 

下方是strstr函数的模拟实现和运行结果。

const char* my_strstr(const char* str1,const char* str2)
{
	const char* cp;//记录开始匹配的位置
	const char* s1;//遍历str1指向的字符串
	const char* s2;//遍历str2指向的字符串
	assert(str1 && str2);
	if (*str2 == '\0')
		return str1;  
	cp = str1;
	while (*cp)
	{
		s1 = cp;
		s2 = str2;
		while (*s1&&*s2&&*s1 == *s2)
		{
			s1++;
			s2++; 
		}
		if (*s2 == '\0')
			return cp;
		cp++;
	}
	return NULL;
}

int main()
{
	char arr1[] = "abbbcdef";
	char arr2[] = "bbc";
	const char* ret = my_strstr(arr1, arr2);
	if (ret == NULL)
		printf("找不到\n");
	else
		printf("%s\n", ret);
	return 0;
}

分析:为了不改变原始数据,我们创建了另外3个指针, cp指向str1的起始位置,s1用来遍历str1指向的字符串,每次循环结束(即查找失败)时,cp++使cp指向str1的下一位,再把cp赋给s1。s2用来遍历str2指向的字符串,每次循环结束,就要使s2回到str2的起始位置。内层while的条件中*s1&&*s2用来判断他们是否已经遇到\0,如果遇到则停止,*s1==*s2用来判断相对应的字符是否相同,相同则继续。当*s2==\0时表明s2已经到str2的末尾了,说明已经在str1中找到和str2一样的字符串了,这时就可以直接返回此时cp的位置。还有一种特殊的情况,等str2时空字符串时,即"",我们直接返回str1的起始地址,因为空集是任何一个集合的子集。

评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

秦jh_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值