C语言中的string系列函数的模拟实现

字符串函数主要有这些

这些都是库里的函数可以直接使用,这里主要讲以下它的用法和模拟实现
另外在这里介绍一个学习网页http://www.cplusplus.com,可以在上面搜索相关的函数等
在这里插入图片描述

  1. strlen    求字符串长度函数
  2. strcpy   字符串拷贝函数
  3. strcat   字符串追加函数
  4. strcmp  字符串比较函数

strlen: 计算字符串长的函数
这是一个库里面的函数我们可以直接使用,比如:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>//需要引用的头文件
int main()
{
	char  arr[8]="abcdefg";
	printf("%d\n",strlen(arr));
	system("pause");
	return 0;
}

来看一下运行结果:
在这里插入图片描述
可以看到 strlen 函数可以直接计算出字符串的长度;但要注意的是:

字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包 含 ‘\0’ )。
参数指向的字符串必须要以 ‘\0’ 结束。
注意函数的返回值为size_t,是无符号的

那么strlen 具体是如何实现的呢?来看代码:
非递归

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
size_t my_strlen(char *arr)//注意返回值是一个无符号整形的
{
	char *str=arr;//数组首元素地址给到str str类型是 char *
	int count=0;
	while(*str!='\0')
	{
		count++;
		str++;//不断向后移动,进行判断
	}
	return count;
}
int main()
{
	int ret;
	char arr[8]="abcdefg";
	ret=my_strlen(arr);
	printf("%d",ret);
	system("pause");
	return 0;
}

递归实现

size_t my_strlen1(char *arr)
{
	  if(*arr== '\0')    
		  return 0;  
	  else       
		  return 1+my_strlen1(arr+1); 
}

strcpy : 字符串拷贝函数。
首先来看一下strcpy在cplusplus中的解释:
在这里插入图片描述
首先它的返回类型是一个 char *
是把source源字符串 复制拷贝到目标字符串 dst中
注:

源字符串必须以 ‘\0’ 结束。
会将源字符串中的 ‘\0’ 拷贝到目标空间。
目标空间必须足够大,以确保能存放源字符串。
目标空间必须可变。而const 保证源字符串不被修改

接下来看一下strcpy的功能和模拟实现:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>//assert函数头文件
char *  my_strcpy( char *dst, const char * src)
{
	char *ret=(char *)dst;
	assert(dst&&src);//判断两个字符串不为空,当表达式为0时程序终止执行
	//但只在Debug版本中生效,Release终会忽略
	while(*dst++=*src++)
	{	
		;//这里进行一个空循环
	}
	return ret;
}

int main()
{
	char dst[6]="hello";
	char src[6]="world";
	char *ret;
    ret=my_strcpy(dst,src);
	printf("%s\n",ret);
	system("pause");
	return 0;
}

再来看运行结果:
在这里插入图片描述
strcat : 字符串追加函数。
也是一个字符串操作函数,先来看一下它的形式:
在这里插入图片描述
可以看到和strcpy在形式上是一样的,但他们的含义却不一样

strcat 就是把源字符串追加拷贝到目标字符串中,需要注意以下几点:
源字符串必须以 ‘\0’ 结尾
目标字符串必须足够大,能够容纳源字符串。
目标空间可以被修改

来看strcat的作用和具体模拟实现:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
char * my_strcat(char *dst1,const char *src1)//模拟实现
{
	char *ret=dst1;
	assert(dst1&&src1);
	while(*dst1)
	{
		dst1++;//找到dst的末尾
	}
	while(*dst1++=*src1++)//将src的内容追加到dst后面
	{
		;
	}
	return ret;
}
int main()
{
	char dst1[20]="hello";
	char *src1="world";
	char dst2[20]="hello";
	char *src2="world";
	char *ret;
	char*temp;
	temp=strcat(dst2,src2);
	ret=my_strcat(dst1,src1);
	printf("%s\n",ret);
	printf("%s\n",temp);
	system("pause");
}

再看运行结果:
在这里插入图片描述
strcmp : 字符串比较函数。
先来看一下它的形式:
在这里插入图片描述
可以看到这是一个返回值为 int 类型的函数,那么它返回什么呢?来看一下cplusplus中的解释
在这里插入图片描述
可以看到它会返回三个值小于返回一个负数,相等返回0,大于返回一个正数。
那么具体的使用和模拟实现看代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
int my_strcmp( const char* str1,const char *str2)
{
     assert(str1&&str2);
	 while((*str1!='\0')&&(*str2!='\0'))
	 {
	 if(*str1>*str2)
	 {
		 return 1;
	 }
	 if(*str1<*str2)
	 {
		 return -1;
	 }
	 str1++;
	 str2++;
	 if(('\0'==*str1)&&(*str2=='\0'))
	 {
		 return 0;
	 }
	 }
}
int main()
{
	int ret;
	char *str1="abc";
	char *str2="aac";
	char *str3="ab";
	char *str4="ac";
	char *str5="abcd";
	char *str6="abcd";
    ret=my_strcmp(str1,str2);
	printf("%d\n",ret);
	printf("%d\n",strcmp(str3,str4));
	printf("%d\n",strcmp(str5,str6));
	system("pause");
	return 0;
}

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

可以看到strcmp是逐个字符进行比较的,而比较的也是字符的ASCII码,只要有一个比另一个打就停止比较。这个函数主要用来判断两字符串是否相等。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值