【c语言】字符串函数的模拟实现(二)

这篇具有很好参考价值的文章主要介绍了【c语言】字符串函数的模拟实现(二)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

strcat的介绍及实现

strcat的作用就是字符串追加,即将一个字符串添加到另一个字符串末尾。
那既然要追加字符串,要怎么找到目标字符串的末尾呢?所以这就要求目标空间中要有'\0',找到'\0'就是找到末尾了。需要注意的是此函数内部在找末尾时,找的是目标空间中第一个'\0'的位置,然后从此位置开始追加。又开始就要有结束,所以源字符串中也要有'\0'。既然要追加字符串,所以目标空间必须可以被修改。
strcat将源字符串追加到目标字符串末尾,那么目标空间就必须足够大。还有一点需要注意的是,此函数返回的是目标空间首元素地址。
【c语言】字符串函数的模拟实现(二),c语言学习,c语言,开发语言
根据上面总结了以下几点:

  1. 目标空间要有'\0',(开始追加的地方)
  2. 源头字符串中要有'\0',(追加到此处结束)
  3. 目标空间要足够大可修改

实现方法如下:

#include<stdio.h>
#include<assert.h>

char* my_strcat(char* dest, const char* src)
{
	char* ret = dest;//记录目标字符串首元素地址
	assert(dest && src);
	//1.找到目标空间的'\0'
	while (*dest != '\0')
	{
		dest++;
	}
	//2.拷贝数据
	while (*dest++ = *src++)
	{
		;
	}
	//3.返回参数
	return ret;
}
int main()
{
	char arr1[20] = "hello";
	char* p = "world";
	printf("%s\n",my_strcat(arr1, p));
	return 0;
}

【c语言】字符串函数的模拟实现(二),c语言学习,c语言,开发语言
再来思考这么一个问题:如果用strcat自己给自己追加会发生什么,如下:

my_strlen(arr1,arr1);

仔细分析一下会发现,当找到目标空间的'\0'时,源字符串就会将此'\0'修改,那么在继续追加字符时,由于源字符串和目标空间相同,且'\0'被修改,则此函数就无法结束,从而导致程序崩溃。

strcmp的介绍及实现

strcmp是比较两个字符串的大小关系的函数。
关于比较规则:比较的是两个字符串中对应位置上的字符,一开始比较的则是两个字符串的首元素所对应的字典序。如果两个所对应的字典序不同,则会继续比较,直到比较到两个不同的字符或是找到了'\0'。如果比较的结果是:

  1. str1 > str2,则返回大于0的数;
  2. str1 = str2,则会返回0,这里的相等是直至字符串末尾都相等;
  3. str1 < str2,则会返回小于0的数

关于函数参数:strcmp返回值是一个整形,接收的参数是两个字符串的地址,而此地址指向的地址是不可修改的,所以用const修饰。
【c语言】字符串函数的模拟实现(二),c语言学习,c语言,开发语言
模拟实现如下:

#include<stdio.h>
#include<assert.h>

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;
	//此处也可以直接用两值的差作为返回值
	//即:return *str1 - *str2;
}
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abc";
	int ret = my_strcmp(arr1, arr2);
	printf("%d\n", ret);
	return 0;
}

小结

通过上面介绍的strcatstrcmp这两个函数,及在 字符串函数的模拟实现中介绍的strcmp函数,我们发现这些都是长度不受限制的字符串函数。因为这个特点,所以我们在使用时存在一些安全性的问题,这就要求我们在使用时要格外的小心,防止发生包括但不限于越界访问,死循环导致的程序崩溃等问题
所以c语言也引入了如strncpystrncatstrncmp等长度受限制的字符串函数,下面我会对这些函数一一介绍。

strncpy的介绍及实现

strncpy就是拷贝num个字符从源字符串到目标空间。
在使用时当然还有一些细节要注意:

  1. 当要拷贝的字符个数num大于源头字符串的的长度时,会在目标空间继续拷贝'\0'直至达到num个;
  2. 如果num小于源字符串的话,strncpy并不会在目标空间多拷贝一个'\0'表示结束;
  3. 相较于strcpystrncpy多了一个参数类型为size_t的参数,这就是需要拷贝的字符的个数。
    【c语言】字符串函数的模拟实现(二),c语言学习,c语言,开发语言

strncpy模拟实现图解:
【c语言】字符串函数的模拟实现(二),c语言学习,c语言,开发语言

模拟实现:文章来源地址https://www.toymoban.com/news/detail-729429.html

#include<stdio.h>
#include<assert.h>

char* my_strncpy(char* dest, const char* src, size_t num)
{
	char* ret = dest;
	assert(dest && src);
	//拷贝源字符串中的字符到目标空间,记录剩下需要拷贝的字符,直到num为0或源字符串结束
	while (num && (*dest++ = *src++))
		num--;
	//判断拷贝是否结束,如果没有继续拷贝num个'\0'
	if (num)
		while (--num)
			*dest++ = '\0';
	return ret;
}
int main()
{
	char arr1[20] = "hello world";
	char arr2[] = "love";
	printf("%s\n", my_strncpy(arr1, arr2, 4));
	return 0;
}

到了这里,关于【c语言】字符串函数的模拟实现(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C语言】字符函数和字符串函数(一)—>库函数的介绍与模拟实现

    目录 前言: 一、函数介绍: (一)求字符串长度 (1)strlen (二)长度不受限制的字符串函数 (2)strcpy (3)strcat (4)strcmp (三)长度受限制的字符串函数 (5)strncpy (6)strncat (7)strncmp (四)字符串查找 (8)strstr (9)strtok (五)错误信息报告 (10)strerror (六)

    2024年02月15日
    浏览(46)
  • 【C语言】——字符串函数的使用与模拟实现(上)

      在我们学习 C语言 的过程中,对 库函数 的使用是必不可少的。其中,相信大家最熟悉的就是 s t d i o . h stdio.h s t d i o . h 中的 p r i n t print p r in t 和 s c a n f scanf sc an f 函数了吧。   但是今天,我们不讲他们(太难了,呜呜呜),今天我们来讲与字符串相关的函数,也就

    2024年04月26日
    浏览(41)
  • 【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现

    🔍个人主页 : @啊森要自信的主页 ✏️ 真正相信奇迹的家伙,本身和奇迹一样了不起啊! 欢迎大家关注🔍点赞👍收藏⭐️留言📝希望看完我的文章对你有小小的帮助,如有错误,可以指出,让我们一起探讨学习交流,一起加油鸭。 本小节我们将学习字符分类函数,字符

    2024年02月04日
    浏览(55)
  • C语言:字符串函数的使用方法及模拟实现

    方法一:计数器方式 方法二:指针-指针 1.1 strcpy只用于字符串复制,遇到‘\\0’时停止,还会复制字符串的结束符\\\'\\0\\\'; 所以源字符串必须         以’\\0’结束,也会将源字符串的’\\0’拷贝到目标空间。 1.2 目标空间必须可变。 1.3 如果参数dest所指的内存空间不够大,可能

    2024年04月25日
    浏览(44)
  • C语言学习NO.13-字符函数(三)-strncpy,strncat,strncmp长度受限制的字符串函数

    •使用时需要包含头文件string.h • 将源字符串的前num个字符复制到目标。如果源C字符串的末尾在复制num个字符之前找到\\\'\\0\\\',剩下自动记0,直到总共写入了num个字符。 •拷贝num个字符从源字符串到目标空间。 •如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的

    2024年01月24日
    浏览(73)
  • c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(下))

    上篇文章介绍了一些常用的字符串函数,大家可以跳转过去浏览一下:c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(上))_总之就是非常唔姆的博客-CSDN博客 今天接着来介绍一些:  目录 一.字符串查找 1.strstr() 1.1示例 1.2注意事项: 1.3模拟实现  2.

    2024年02月07日
    浏览(45)
  • 【C语言】字符串函数strcpy&&strcat&&strcmp&&strstr的使⽤和模拟实现

    🔍个人主页 : @啊森要自信的主页 ✏️ 真正相信奇迹的家伙,本身和奇迹一样了不起啊! 欢迎大家关注🔍点赞👍收藏⭐️留言📝希望看完我的文章对你有小小的帮助,如有错误,可以指出,让我们一起探讨学习交流,一起加油鸭。 记上节,我们学了字符串 strlen 的使用和

    2024年02月05日
    浏览(47)
  • 字符函数和字符串函数的模拟实现

    求字符串长度 strlen  长度不受限制的字符串函数 strcpy strcmp strcat 长度受限制的字符串函数 strnlen strncmp strncpy strncat 字符串查找 strstr strtok 错误信息报告 strerror 内存操作函数 memcpy memmove memset memcmp  首先我们来看strlen 字符串是以‘\\0’为结束标志,strlen函数返回的是‘\\0’出现

    2024年02月13日
    浏览(51)
  • 字符函数和字符串函数解析及模拟实现

    字符串以’\\0’作为结束标志,strlen函数返回的是在字符串中’\\0’前面出现过的字符个数(不包括’\\0’)。 参数指向的字符串必须以’\\0’结束。 注意函数的返回值位size_t, 是无符号的 。 Copies the C string pointed by source into the array pointed by destination, including the terminating null c

    2024年02月16日
    浏览(46)
  • 字符和字符串的库函数模拟与实现

    前言: 相信大家平常在写代码的时候,用代码解决实际问题时苦于某种功能的实现,而望而止步,这个时候库函数的好处就体现出来了,当然个人代码编写能力强的可以自己创建一个函数,不过相当于库函数来说却是浪费了一点时间,库函数的准确性和有效性对我们的好处就

    2024年02月10日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包