c语言练习41:深入理解字符串函数strlen strcpy strcat

深入理解字符串函数strlen strcpy strcat

模拟实现:"strlen strcpy strcat

strlen

strcat:

cpp 复制代码
#define  _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<assert.h>
strlen
1.通过指针移动模拟
//int my_strlen(char* str) {
//	size_t count = 0;
//	assert(str != NULL);
//	while (*str != '\0') {
//		count++;
//		str++;
//	}
//	return count;
//}
2.通过指针减指针模拟
//int my_strlen(char* str) {
//	char* start = str;
//	while (*str != '\0') {
//		str++;
//	}
//	return str - start;
//}
//通过递归模拟
//int my_strlen(char* str) {
//	if (*str != '\0')
//		return 1 + my_strlen(str + 1);
//	else
//		return 0;
//}
//int main() {
//	char arr[] = "abcd";
//	size_t len=my_strlen(arr);
//	printf("%zd\n", len);
//	return 0;
//}
//模拟实现strcpy
//strcpy的功能是将原字符串拷贝到目标空间
//所以返回目标空间的起始地址,方便观察目标空间的数据
//#include<stdio.h>
//#include<assert.h>
//版本1
//void my_strcpy(char* dest, char* str) {
//	while (*str != '\0') {
//		*dest = *str;
//		str++;
//		dest++;
//	}
//	*dest = *str;
//}
//版本2
//dest指向的空间是需要改变的,而src指向的空间是不需要被改变的
//void my_strcpy(char* dest, const char* str) {//加上const可以提高代码的健壮性
//	assert(dest && str);//解引用时指针不能为空
//	while (*dest++ = *str++) {//()内为赋值表达式且'\0'的ASCII为0
//		;
//	}
//}
//版本3
//char* my_strcpy(char* dest,const char* str) {
//	char* start = dest;//dest为1级指针然后赋给start
//	//判断是否为空指针
//	assert(dest);
//	assert(str);
//	while (*dest++=*str++)
//	{
//		;
//	}
//	return start;//返回目标空间的起始地址
//}
//int main() {
//	char arr1[] = "abcd";
//	char arr2[20] = {0};
//	my_strcpy(arr2, arr1);
//	printf("%s\n", arr2);
//	版本3:链式访问
//	///*printf("%s\n", my_strcpy(arr2, arr1));*/
//	return 0;
//}
模拟strcat---字符串的追加
 my_strcat无法实现自身追加自身------因为目标空间的'\0'会被覆盖
 -------------------但strcat可实现-------------------
注:1.目标空间的有'\0'(从哪里开始追加),源头空间也得有'\0'(追加到什么时候结束)
2.目标空间足够大且目标空间可修改
测试
#include<stdio.h>
#include<string.h>
int main() {
	char arr1[20] = "hello \0xxxxxxxxxx";
	char* p = "world";
	strcat(arr1, p);
	printf("%s\n", arr1);
	return 0;
}
模拟实现strcat
strcat返回目标空间的起始地址
//#include<stdio.h>
//#include<assert.h>
//char* my_strcat(char* dest, const char* src) {
//	char* start = dest;
//	assert(dest);
//	assert(src);
//	//1.找到目标空间中的'\0'
//	while (*dest!='\0')
//	{
//		dest++;
//	}
//	//2.完成拷贝
//	while (*dest++=*src++)
//	{
//		;
//	}
//	return start;
//}
//int main() {
//	char arr1[20] = "hello";
//	char* p = "world";
//	my_strcat(arr1, p);
//	printf("%s\n", arr1);
//	return 0;
//}
//strncat可实现自身追加自身
相关推荐
qk学算法几秒前
力扣滑动窗口题目-76最小覆盖子串&&1234替换子串得到平衡字符串
数据结构·算法·leetcode
小欣加油2 分钟前
leetcode 860 柠檬水找零
c++·算法·leetcode·职场和发展·贪心算法
粉色挖掘机1 小时前
矩阵在密码学的应用——希尔密码详解
线性代数·算法·机器学习·密码学
买辣椒用券1 小时前
在Linux上实现Modbus RTU通信:一个轻量级C++解决方案
linux·c++
七七七七071 小时前
【计算机网络】UDP协议深度解析:从报文结构到可靠性设计
服务器·网络·网络协议·计算机网络·算法·udp
TitosZhang1 小时前
排序算法稳定性判断
数据结构·算法·排序算法
xskukuku2 小时前
华为技术有限公司 C语言编程规范
c语言·嵌入式
光子物联单片机2 小时前
C语言基础开发入门系列(八)C语言指针的理解与实战
c语言·开发语言·stm32·单片机·mcu
是苏浙2 小时前
零基础入门C语言之文件操作
c语言·开发语言
小龙报2 小时前
《C语言疑难点 --- C语内存函数专题》
c语言·开发语言·c++·创业创新·学习方法·业界资讯·visual studio