C语言:模拟实现字符串函数strlen,strcpy,strcat,strcmp,strchr,strstr

什么是C语言中的字符串

字符串或串(String)是由数字、字母、下划线组成的一串字符。通常放在常量字符串中或者字符数组中。C语言中以 ‘\0’ 来作为字符串的结束标记。

字符的ASCII编码表
在这里插入图片描述

1.strlen

功能:字符串求长
计算给定字符串的(unsigned int型)长度,不包括 ‘\0’ 在内,参数指向的的字符串必须以 ‘\0’ 结束,返回值为 size_t 无符号的。

用法:
size_t strlen ( const char * str )

头文件:string.h

模拟实现:

//非递归
int my_strlen1(const char *str)
{
	int count = 0;
	while(*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}

//递归
int my_strlen2(const char *str)
{
	if (*str == '\0')
	{
		return 0;
	}
	else
		return 1 + my_strlen2(str + 1);
}

运行结果:

	char str[100] = {0};
	printf("请输入字符串:");
	scanf("%s",&str);
	printf("字符串长度为:%d\n",my_strlen1(str));
	printf("字符串长度为:%d\n",my_strlen2(str));

在这里插入图片描述

2.strcpy

功能:字符串串复制
把源字符串复制到目标空间。源字符串必须以 ‘\0’ 结束,目标空间必须可变,src 和 dest 所指内存区域不可以重叠且 dest 必须有足够的空间来容纳 src 的字符串。

用法:
char * strcpy ( char * destination, const char * source )

头文件:string.h

模拟实现:

char *my_strcpy(char *dest, const char *src)
{
	char *ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while((*dest++ = *src++))
	{
		;
	}
	return ret;
}

运行结果:

	char str1[] = "i im a boy";
	char str2[100] = {0};
	printf("src:%s\n",str1);
	printf("dest:%s\n",my_strcpy(str2, str1));

在这里插入图片描述

3.strcat

功能:字符串连接
把两个字符串连接起来。源字符串必须以 ‘\0’ 结束,目标空间必须可变。把 src 所指字符串添加到 dest 结尾处(覆盖 dest 结尾处的 ‘\0’ ), dest 必须有足够的空间来容纳 src 的字符串

用法:
char * strcat ( char * destination, const char * source )

头文件:string.h

模拟实现:


char *my_strcat(char *dest, const char *src)
{
	char *ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while(*dest != '\0')
	{
		dest++;
	}
	while((*dest++ = *src++))
	{
		;
	}
	return ret;
}

运行结果:

	char str1[100] = "i im";
	char str2[] = " a boy";
	printf("%s\n",my_strcat(str1, str2));

在这里插入图片描述

4.strcmp

功能:字符串比较
设这两个字符串为str1,str2,
看ASCII码
若str1=str2,则返回零;
若str1<str2,则返回负数;
若str1>str2,则返回正数。

用法:
int strcmp ( const char * str1, const char * str2 )

头文件:string.h

模拟实现:

int my_strcmp(const char *str1, const char *str2)
{
	int ret = 0;		
	assert(*str1 != NULL);
    assert(*str2 != NULL);
	while( ! (ret = *(unsigned char *)str1 - *(unsigned char *)str2) && *str2)
	{
		str1++;
		str2++;
	}
	if (ret < 0)
		ret = -1;
	else if (ret > 0)
		ret = 1;
	return (ret);
}

运行结果:

	char *str1 = "abcde";
	char *str2 = "abcde";
	char *str3 = "abcef";
	printf("%d\n",my_strcmp(str1, str2));
	printf("%d\n",my_strcmp(str1, str3));
	printf("%d\n",my_strcmp(str3, str2));

在这里插入图片描述

5.strchr

功能:查找字符串str中首次出现字符c的位置
返回首次出现c的位置的指针,返回的地址是被查找字符串指针开始的第一个与Val相同字符的指针,如果str中不存在c则返回NULL。

用法:

const char * strchr ( const char * str, int character )
      char * strchr (       char * str, int character )

头文件:string.h

模拟实现:

char *my_strchr(char *str, char c)
{
 
	assert(str != NULL);
	while(*str != '\0' && *str != c)
	{
		++str;
	}	
	return *str == c ?str:NULL;
}

运行结果:

	 char *str = "abcdef";
	 printf("%s\n",my_strchr(str, 'c'));

在这里插入图片描述

6.strstr

功能:在字符串中查找
str1: 被查找目标 string expression to search
str2: 要查找对象 The string expression to find
返回值:若str2是str1的子串,则返回str2在str1的首次出现的地址;如果str2不是str1的子串,则返回NULL。

用法:

const char * strstr ( const char * str1, const char * str2 );
      char * strstr (       char * str1, const char * str2 )

头文件:string.h

模拟实现:

char *my_strstr(const char *dest, const char *src)
{
    assert(dest);
	while (*dest)
	{
		while ((*dest != *src) && (*dest != 0))
			dest++;
		while (*dest == *src)
		{
			const char*pdest = dest;
			const char*psrc = src;
			while(*pdest == *psrc) 
			{
				pdest++;
				psrc++;
			}
			if (*psrc == 0)
				return (char*)dest;
			else 
				dest++;
		}
	}
	    return NULL;
}

运行结果:

    char *str1 = "qwertyuiop";
	char *str2 = "yui";
	char *str3 = "ery";
	printf("%s\n", my_strstr(str1, str2));
	printf("%s\n", my_strstr(str1, str3));

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学生参加学科竞赛有着诸多好处,不仅有助于个人综合素质的提升,还能为未来职业发展奠定良好基础。以下是一些分析: 首先,学科竞赛是提高专业知识和技能水平的有效途径。通过参与竞赛,学生不仅能够深入学习相关专业知识,还能够接触到最新的科研成果和技术发展趋势。这有助于拓展学生的学科视野,使其对专业领域有更深刻的理解。在竞赛过程中,学生通常需要解决实际问题,这锻炼了他们独立思考和解决问题的能力。 其次,学科竞赛培养了学生的团队合作精神。许多竞赛项目需要团队协作来完成,这促使学生学会有效地与他人合作、协调分工。在团队合作中,学生们能够学到如何有效沟通、共同制定目标和分工合作,这对于日后进入职场具有重要意义。 此外,学科竞赛是提高学生综合能力的一种途径。竞赛项目通常会涉及到理论知识、实际操作和创新思维等多个方面,要求参赛者具备全面的素质。在竞赛过程中,学生不仅需要展现自己的专业知识,还需要具备创新意识和解决问题的能力。这种全面的综合能力培养对于未来从事各类职业都具有积极作用。 此外,学科竞赛可以为学生提供展示自我、树立信心的机会。通过比赛的舞台,学生有机会展现自己在专业领域的优势,得到他人的认可和赞誉。这对于培养学生的自信心和自我价值感非常重要,有助于他们更加积极主动地投入学习和未来的职业生涯。 最后,学科竞赛对于个人职业发展具有积极的助推作用。在竞赛中脱颖而出的学生通常能够引起企业、研究机构等用人单位的关注。获得竞赛奖项不仅可以作为个人履历的亮点,还可以为进入理想的工作岗位提供有力的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值