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可实现自身追加自身
相关推荐
HelloReader18 分钟前
Wi-Fi CSI 感知技术用无线信号“看见“室内的人
算法
颜酱3 小时前
二叉树分解问题思路解题模式
javascript·后端·算法
qianpeng8974 小时前
水声匹配场定位原理及实验
算法
董董灿是个攻城狮16 小时前
AI视觉连载8:传统 CV 之边缘检测
算法
RuoZoe21 小时前
重塑WPF辉煌?基于DirectX 12的现代.NET UI框架Jalium
c语言
blasit1 天前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
AI软著研究员1 天前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish1 天前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱1 天前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
地平线开发者2 天前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶