长度不受限制的字符串函数【详解+模拟实现】

字符串函数

字符串函数即为在操作字符串中使用的一些函数,例如gets()函数(在标准输入设备中读取字符串函数,以回车结束),或者strlen函数,这些函数都属于字符串函数
且字符串函数其实可以分为两种
1.长度不受限制的字符串函数
2.长度受限制的字符串函数



长度不受限制的字符串函数

长度不受限制的字符串函数,字面意思,即在使用该类函数对字符串进行操作时,不存在长度限制
例如strlen()函数,该函数判断字符串的长度,且该函数在使用中,长度不受限制。
除了strlen函数,本章还会介绍:
strcpy函数 - 字符串拷贝函数
strcat函数 - 字符串追加函数
strcmp函数 - 字符串比较函数



strcpy函数

strcpy函数
字符串拷贝函数,一般可以用于将一个字符串的内容拷贝到另一个字符串中(或字符数组中,包括’\0’)。 且在拷贝过程中,不受字符串的长度限制,该函数将字符串拷贝到另一块字符数组中,直到将字符’\0’拷贝过去为止

strcpy函数的使用
int main()
{
	char arr1[] = "abcde";
	char arr2[20] = "xxxxxxxxxxxx";
	strcpy(arr2, arr1);
//此时arr2[]内的元素即为{'a','b','c','d','e','\0','x','x','x','x','x','x'}
	return 0;
}

由此可知,strcpy函数会将原字符串中的’\0’也一并拷贝到目标字符串中


strcpy函数的模拟实现

在这里插入图片描述

从该图可以看出,strcpy函数的返回值为char*,且共有两个参数

  1. char* strDestination - 需要拷贝的目的地地址
    2.const char* strSource - 源字符串首字符地址
    根据该图的参数,是否能模拟出strcpy函数?

可 !!
根据给出的信息,可以了解该函数传递的两个参数即为目的地及原字符串的首字符地址,且该函数在拷贝过程中将源字符串上的’\0’也一并拷贝进了目标地址,故可以使用while循环,遍历并拷贝该字符串中各个字符至目标地址,直到该字符串拷贝完’\0’,即拷贝结束;
理论存在,实践开始:

#include<assert.h>

char* my_strcpy(char* dest, const char* src)
{
	//为了提高代码健壮性,且在该程序中指针src中的数据不进行改动
	//故使用const将指针src进行修饰,防止其被更改

	assert(dest && src);
	//确保该函数中传入的两个地址为非指针,对两个指针进行断言
	char* ret = dest;
	//创建一个指针变量存放目标地址的初始位置,方便返回
	while (*dest++ = *src++) {
		;//对字符边进行遍历边进行拷贝,当拷贝至'\0'时,('\0'的ASCII码值为0),即为假,跳出循环
	}
	return ret;
}
void test1()
{
	char arr1[] = "abcdefg";
	char arr2[20] = { 0 };
	my_strcpy(arr2,arr1);
	printf("%s\n", arr2);
}
int main()
{
	test1();
	return 0;
}

strcpy函数使用注意事项

在strcpy函数使用过程中,应确保几件事:

  • 源字符串必须以’\0’结束。
  • 会将源字符串中的’\0’拷贝到目标空间。
  • 目标空间必须足够大,以确保能存放源字符串。
  • 目标空间必须可变。


strcat函数

strcai函数
字符串追加函数,一般用于在一个字符串中追加另一个字符串的内容
该函数会从目标字符串的’\0’处开始追加源字符串内的内容,直到’\0’结束。


strcat函数的使用

使用例子参考以下代码:

#include<string.h>
#include<stdio.h>
void test1()
{
	char arr1[20] = "hello \0xxxxxxxxxx";
	char arr2[] = "world";
	strcat(arr1, arr2);
	printf("%s\n", arr1);
}
int main()
{
	test1();
	return 0;
}

结果如下

在这里插入图片描述

从该结果可知,strcat函数在使用过程中,找到目标空间的’\0’位置并将该位置开始向后的内容修改为源字符串,直到拷贝完’\0’则停止。

strcat函数的模拟实现

在这里插入图片描述

从该图可以看出,strcat函数内的参数与strcpy函数中的参数相差无异,
函数的返回类型都为char*
且都存在两个同样的参数 char* strDestination , const char* strSource
在上面的使用过程中,可以看出该函数在追加的过程中,是从目标字符串的’\0’处向后开始追加,直到追加完源字符串内的’\0’即停止
根据这些内容,能否模拟出一个与strcat函数相同的函数。


可!!
从上述内容可知,可以遍历目标字符串的各个字符找到’\0’时停下并从该处开始追加源字符串的内容,直至’\0’结束
理论存在,实践开始。

#include<stdio.h>

#include<string.h>

#include<assert.h>
char* my_strcat(char*dest,const char*src)
{	//提高健壮性,且确保指针src内的值不会被通过src进行修改,故对src指针进行const修饰

	//确保传进的两个参数都不为空指针NULL
	assert(dest && src);
	char* ret = dest;//创建一个指针变量用来存放目标地址的初始地址,方便最后返回
	while (*++dest != '\0');//找到目标字符串中的'\0'
	while (*dest++ = *src++);//从目标字符串中的'\0'处开始追加原字符串内容,直到遇到'\0'则停下
	return ret;
}
void test1()
{
	char arr1[20] = "hello \0xxxxxxxxxx";
	char arr2[] = "world";
	my_strcat(arr1, arr2);
	printf("%s\n", arr1);
}
int main()
{
	test1();
	return 0;
}

strcat函数的注意事项

在使用strcat函数中,应注意:

  • 源字符串必须以’\0’结束。
  • 目标空间必须有足够大,且能容纳下源字符串的内容。
  • 目标空间可被修改。


strcmp函数

strcmp函数
字符串比较函数,通常用来比较两个字符串的大小,比较过程中将两个字符串上相同位置的字符,通过ASCII码值进行比较,当比较出结果时则停止比较
存在以下代码:

strcmp(arr1,arr2);

若:
arr1>arr2则返回大于0的值,
arr1<arr2则返回小于0的值,
两者相等则返回0。

strcmp函数的使用

存在下列代码:

void test1() 
{
	char arr1[] = "abcde";
	char arr2[] = "abcd";
	printf("%d\n", strcmp(arr1,arr2));
}
void test2()
{
	char arr1[] = "abcde";
	char arr2[] = "abcdef";
	printf("%d\n", strcmp(arr1, arr2));
}
void test3()
{
	char arr1[] = "abcde";
	char arr2[] = "abcde";
	printf("%d\n", strcmp(arr1, arr2));
}
int main()
{
	test1();
	test2();
	test3();
	return 0;
}

结果如下:

在这里插入图片描述

从结果可以看出,在vs编译器下,strcmp函数在使用中的规则为:
两个字符串进行比较(arr1,arr2):
arr1>arr2返回1
arr1<arr2返回-1
arr1==arr2则返回0

strcmp函数的模拟实现

在这里插入图片描述

从该图可以看出,strcmp函数的返回类型为int类型
且该函数共有两个参数,参数均为const char*类型
即在使用过程中,两个指针内部的值不会被修改(const修饰)
根据以上内容,且以vs编译器的环境下


模拟实现该函数:
利用while循环遍历两个字符串中的每一个字符,并对两个字符进行比较,若是相等,则继续比较,若是不相等,则退出循环;判断两个字符的ASCII码值的大小,对应的返回1,0,-1(大于0,小于0,等于0的值)。
理论存在,实践开始。

#include<assert.h>
int my_strcmp(const char*base1,const char*base2)
{	//确保提高两个指针的安全性,对两个指针进行const修饰

	//确保两个指针都不为空指针,对两个指针进行断言
	assert(base1&&base2);
	while (*base1++ == *base2++) {
		//遍历两个字符串,当两个字符串内的内容都相等
		//且两个字符串都遍历到了'\0'处,则两个字符串相等
		if(*base1=='\0'&& *base2 == '\0')
		{
			return 0;//当两个字符串相等时返回0
		}
	}
	if (*(base1 - 1) > *(base2 - 1)) { 
		//再进行最后一次循环时,两个指针都已经向后越了一步
		//故判断两个指针最后一步之前的那一步时哪个字符比较大
		//若是*base1>*base2则返回1
		return 1;
	}
	//否则返回-1
	else return -1;

}
void test1()
{
	char arr1[] = "abcde";
	char arr2[] = "abcd";
	printf("%d\n", my_strcmp(arr1, arr2));
}
void test2()
{
	char arr1[] = "abcde";
	char arr2[] = "abcdef";
	printf("%d\n", my_strcmp(arr1, arr2));
}
void test3()
{
	char arr1[] = "abcde";
	char arr2[] = "abcde";
	printf("%d\n", my_strcmp(arr1, arr2));
}
int main()
{
	test1();
	test2();
	test3();
	return 0;
}

strcmp函数的注意事项

strcmp函数在使用中应明白

  • 第一个字符串大于第二个字符串时,返回大于0的数;
  • 第一个字符串等于第二个字符串时,返回0;
  • 第一个字符串小于第二个字符串时,返回小于0的数;
  • 比较的为两个字符串对应字符的ASCII码值,当比较处结果时则停止比较。
  • 并非谁长谁就大。

  • 14
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Dio夹心小面包

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

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

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

打赏作者

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

抵扣说明:

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

余额充值