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可实现自身追加自身
相关推荐
2601_954526753 小时前
【工业传感与算法实战】温漂补偿与零点抗漂破局:基于二阶多项式拟合的 C/C++ 边缘校准算法,深度拆解“压力变送器什么牌子好”的技术硬指标
c语言·c++·算法
qq_448011163 小时前
C语言中的变量和函数的定义与声明
android·c语言·开发语言
code_pgf3 小时前
`unordered_map` 详解
c++
叩码以求索4 小时前
浅谈:算法萌新如何高效刷题应对面试(一)
算法·面试·职场和发展
一拳一个呆瓜5 小时前
【STL】iostream 编程:检测提取操作产生的错误
c++·stl
稚南城才子,乌衣巷风流5 小时前
判断素数与拓展应用
c++
众少成多积小致巨5 小时前
C++ 规范参考(下)
c++
c238565 小时前
把 C++ 内存分配拆透:new 与 malloc 的三层血缘
开发语言·c++·算法
aaaameliaaa6 小时前
指针之总结
c语言·笔记·算法
宵时待雨6 小时前
优选算法专题9:哈希表
数据结构·算法·散列表