【C语言】常用的字符串函数使用 && 模拟实现

前言

在使用下面介绍的库函数时声明以下头文件

#include <string.h>

字符串的组成

如下字符数组 str 看似只包含abcde五个字符,实际上由6个字符组成

char str[] = "abcde";

如下
在这里插入图片描述
字符串后面默认带有字符’\0’,这是字符串的结束标志,表示这串字符到结尾了

内存中字符串长度 = 有效字符个数 + 1( ‘\0’ )

需要注意的是:
1:'\0’是给计算器看的使其知道字符串到哪就结束了,但用户不需要看这个’\0‘字符,只需要计算机显示出其字符串有效字符即可。

2:用户看到的字符串不包含’\0‘字符,所以常说的有效字符串长度不包含’\0’

strlen

先看文档该函数的声明
在这里插入图片描述
从该声明可以看出strlen函数的函数参数是字符串指针返回值是size_t类型

函数作用:返回其参数s的字符串有效长度,注意这个长度不包含’\0’
在这里插入图片描述
注意:
1:strlen不能用于测量字符,否则strlen会返回随机数
2:参数 s 所指向的字符串必须以’\0’结尾,否则strlen会返回随机数

模拟实现stlen

思路:用循环不断遍历指向字符的指针,并记录有效字符个数,字符 \0 的ASCII码值为 0 , 所以只要判断指针指向的内容为 \0 后会跳出循环即可

size_t my_strlen(const char* str)//只计算字符串长度,不修改内容所以使用const
{
	assert(str);//str不能为空
	int count = 0;
	while (*str++){//字符 \0 的ASCII码值为 0 ,所以当str指向 \0 后会跳出循环
		count++;//记录有效字符个数
	}
	return count;
}

测试:
在这里插入图片描述

strcpy

先看文档该函数的声明
在这里插入图片描述
参数 dest:是目标字符串地址
参数 src:是源字符串地址

作用:将源字符串内容(包括’\0’),拷贝到目标字符串地址中
返回值:为指向目标字符串的指针
实用方法如下:
在这里插入图片描述
使用strcpy时需注意:
1:源字符串必须以 ‘\0’ 结束。
2:strcpy会将源字符串中的 ‘\0’ 拷贝到目标空间。
3:目标空间必须足够大,以确保能存放源字符串

模拟实现strcpy

思路:
1:两个指针都不能为空否则程序会崩溃
2:保存目标字符串的的初始地址,结束时需要返回
3:将源字符串内容依次追加到目标字符串的第一个’\0’及之后的地址中,最后将源字符串的 ‘\0’ 赋值给目标字符串地址
4:将目标字符串的首地址返回

//模拟实现strcpy

char* my_strcpy(char* dest, const char* src)
{
	assert(dest && src);//保证dest和src都不为空,为空则报错
	char* ret = dest;//保存dest的初始地址

	while (*src) {//src不为'\0'就一直循环
		*dest++ = *src++;
	}
	*dest = *src;//将src'\0'赋值给dest

	return ret;//返回
}

使用方法如下:
在这里插入图片描述

strcmp

先看文档该函数的声明
在这里插入图片描述
其参数为:字符串s1和字符串s2

作用:函数strcmp的功能是比较两个字符串的大小。也就是把字符串str1和str2从首字符开始逐个字符的进行比较,直到某个字符不相同或者其中一个字符串比较完毕才停止比较。字符的比较为ASCII码的比较。

返回值:
若字符串s1大于字符串s2,返回结果大于零;
若字符串s1小于字符串s2,返回结果小于零;
若字符串s1等于字符串s2,返回结果等于零。

模拟实现strcmp

思路:
1:两个指针都不能为空否则程序会崩溃
2:两个字符串从起始字符开始,依此类推一 一对一两者字符ASCII码大小,如不相同时s1大则返回 1 ,s2大则返回-1
2:两者都为 ‘\0’ 时,表示比较结束且都相等,并返回0

//模拟实现strcmp

int my_strcmp(const char* s1, const char* s2)
{
	assert(s1 && s2);//保证dest和src都不为空,为空则报错
	while (1)
	{
		if (*s1 - *s2 != 0)//如不相同时s1大则返回 1 ,s2大则返回 - 1
		{
			return *s1 > *s2 ? 1 : -1;
		}
		if (*s1 == *s2 && *s2 == '\0')//两者都为 ‘\0’ 时,表示比较结束且都相等,并返回0
			return 0;
		//当前字符相等,两者++,进行下一个字符的比较
		s1++;
		s2++;
	}
}

使用方法如下:
在这里插入图片描述

strcat

先看文档该函数的声明
在这里插入图片描述
参数 dest:是目标字符串地址
参数 src:是源字符串地址

作用:将源字符串内容(包括’\0’),追加到目标字符串结尾(字符串的第一个’\0’)
使用方法如下:
在这里插入图片描述

注意:
1:源字符串必须以 ‘\0’ 结束。
2:目标空间必须有足够的大,能容纳下源字符串的内容。
3:目标空间必须可修改。

模拟实现strcat

思路:
1:两个指针都不能为空否则程序会崩溃
2:保存目标字符串的的初始地址,结束时需要返回
3:找到目标字符串第一个’\0’并将源字符串内容依次追加到目标字符串的第一个’\0’及之后的地址中,最后将源字符串的 ‘\0’ 赋值给目标字符串地址
4:将目标字符串的首地址返回

//模拟实现strcat
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{
	assert(dest && src);//保证dest和src都不为空,为空则报错
	char* ret = dest;//保存dest的初始地址

	while (*dest){//循环结束后dest会指向'\0'字符
		dest++;
	};
	
	while (*src){//src不为'\0'就一直循环
		*dest++ = *src++;//将src字符赋值给dest
	}
	*dest = *src;//将src的'\0'赋值给dest

	return ret;//返回dest的初始地址
}

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值