strcat函数的用法_feof函数「建议收藏」

strcat函数的用法_feof函数「建议收藏」一、认识strcatstrcat函数又被称为是字符串追加/连接函数,它的功能就是在一个字符串后面追加上另外一个字符串

一、认识strcat

strcat函数又被称为是字符串追加/连接函数,它的功能就是在一个字符串后面追加上另外一个字符串。
使用方式如下:

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

库函数中strcat函数的声明是char * strcat ( char * destination, const char * source );
经过测试,我们发现strcat的实现模式是将src中的所有字符(连同字符串最后的’\0’一起)加到dest字符串中第一个‘\0’的位置,具体一点说就是将dest中第一个’\0’替换成src的第一个字符,然后该’\0’后的字符替换成src的第二个字符,后面以此类推。
下面我们可以用调试的方式来简单验证一下这个实现方式,调试结果如下
在这里插入图片描述
在这里插入图片描述
通过对比我们可以看到,追加前后在字符串arr1中仅下标从6至11的字符发生了改变,操作机理与上述描述基本符合。
值得注意的是:
1.追加的字符串src和目标字符串dest中都必须要带有字符’\0’,并且追加字符串src必须以‘\0’结尾,否则追加过程无法顺利实现。
2.目标字符串空间必须足够大(足够容纳下追加字符串src的内容)。
3.目标空间必须可修改(前面不能加const并且不能说常量字符串)

二、模拟实现strcat

首先要确定strcat的参数(前面库函数strcat的声明中已经给出),
其次要明确实现的思路:
1.找到目标字符串中的‘\0’
2.将字符串src追加过去(包含’\0’)
我们话不多说,直接上代码

char* my_strcat(char* dest, char* src)
{ 
   
	int ret = dest;
	assert(dest && src);
	while (*dest)
	{ 
   
		dest++;
	}
	while (*dest++ = *src++)
	{ 
   
		;
	}
	return ret;
}

首先先看函数的主体实现部分,按照我们的实现思路,
先是用while循环将dest指向的地址移动到指向目标字符串dest中的‘\0’(这个操作就是strlen模拟实现中的指针减指针法),然后从dest当前位置依次将src中的字符拷贝给dest(strcpy模拟实现中的主体操作)。
其次再看返回值,strcat的返回值依然是目标空间的起始地址,但是此时dest指向的地址已经不是最初的地址了,因此我们引入一个中间变量ret来存储最初的地址并最终将其返回。
最后安全性优化,我们要在函数实现的开头断言dest和ret均不是空指针,前面说过这样可以帮助使用者在出错的时候快速找到问题。
由于这个函数的实现过程和前面strlen和strcpy的实现过程有很多相似之处,故细节问题在这里不做过多解释,有疑问者可以去翻看前两篇关于疑问处的解释。strcat的实现我们就到此为止啦!
模拟实现函数strcat之后,我们初步了解了strcat的实现过程,那么下面我们提一个问题?我们能否使用strcpy函数来在一个字符串后面追加它本身呢?经过实践发现,这样做是不行的,那原因是什么呢?结合下图我们来逐步分析一下。
在这里插入图片描述
假设我们用strcat给“abcd”这个字符串拷贝它自己
第一步首先利用while循环我们将dest指向\0的地址,第二步令 *dest 等于 *src,第三步将dest和src各自加一。在第二步中,dest指向地址原本存储的字符’\0’,被改成了‘a’,接下来的拷贝中永远不会拷贝\0,拷贝过程永远也不会停止,系统崩溃,故不能使用。
好了,那么这个问题也解决了。

今天的文章strcat函数的用法_feof函数「建议收藏」分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/71205.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注