[C语言]模拟实现strcpy

Posted Huang_ZhenSheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[C语言]模拟实现strcpy相关的知识,希望对你有一定的参考价值。

目录

1.模拟实现strcpy

2.const修饰变量的具体情况 

3.模拟实现strlen


1.模拟实现strcpy

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[20] = "xxxxxxxxxx";
	char arr2[] = "hello";
	strcpy(arr1, arr2);//1.目标空间的起始位置 2.源空间的起始地址
	printf("%s",arr1);
	return 0;
}

模拟实现strcpy函数:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
void my_strcpy(char* dest, char* src)
{
	while (*src != '\\0')
	{
		*dest = *src;
		dest++;
		src++;
	}
	*dest = *src;
}
int main()
{
	char arr1[20] = "xxxxxxxxxx";
	char arr2[] = "hello";
	my_strcpy(arr1, arr2);//1.目标空间的起始位置 2.源空间的起始地址
	printf("%s", arr1);
	return 0;
}

优化1:

void my_strcpy(char* dest,const char* src)//const作用:当dest跟src写反的时候会编译会出错
{
	assert(src != NULL);//断言
	//为真发生,为假就会报错,提示在哪一行的哪个文件出现问题
	assert(dest != NULL);//断言
	//把scr指向的内容拷贝放进dest指向的空间中
	while (*dest++ = *src++)
	{
		;//hello的拷贝
	}
}
int main()
{
	char arr1[20] = "xxxxxxxxxx";
	char arr2[] = "hello";
	my_strcpy(arr1, arr2);//1.目标空间的起始位置 2.源空间的起始地址
	printf("%s", arr1);
	return 0;
}

 优化2:(有返回值)

//strcpy 这个库函数 其实返回的是目标空间的起始地址
char* my_strcpy(char* dest, const char* src)//const作用:当dest跟src写反的时候会编译会出错
{
	assert(src != NULL);//断言
	//为真发生,为假就会报错,提示在哪一行的哪个文件出现问题
	assert(dest != NULL);//断言
	//把scr指向的内容拷贝放进dest指向的空间中
	char* ret = dest;//目标空间的起始地址
	while (*dest++ = *src++)
	{
		;//hello的拷贝
	}
	return ret;//返回目标空间的起始地址
}
int main()
{
	char arr1[20] = "xxxxxxxxxx";
	char arr2[] = "hello";
	//my_strcpy(arr1, arr2);//1.目标空间的起始位置 2.源空间的起始地址
	printf("%s\\n", my_strcpy(arr1, arr2));//链式访问
	return 0;
}

以上是标准的库函数的实现,这个库函数我们需要注意哪些点呢? 

1:hello是如何拷贝的,有无包含 ' \\0 '

2:断言是一个部分

3:指针+const是一个部分

4: 返回类型char*是一个部分

下面讲一下const修饰变量的具体情况 

2.const修饰变量的具体情况 

int main()
{
	//1.
	int num = 0;
	int* p = &num;
	*p = 20;
	printf("%d",num);
	return 0;
}
int main()
{
	//2.const修饰变量,这个变量就被称为常变量,不能被修改,但是本质上还是变量
	const int num = 10;
    int* p = &num;
	*p = 20;
	printf("%d\\n", num);
	return 0;
	//输出的结果为20;
}


注意理解:

int main()
{
	const int num = 10;
	const int* p = &num;
	int n = 30;
	//const  修饰指针变量的时候
	//const  如果放在*左边,修饰的是*p,表示指针指向的内容,是不能通过指针来改变的
	//       但是指针变量本身是可以修改的
	*p = 20;//报错
	p = &n;
	printf("%d", num);
	return 0;
	//编译不通过;
}

int main()
{
	const int num = 0;
	int* const p = &num;
	int n = 10;
	//const  修饰指针变量的时候
	//const  如果放在*右边,修饰的是指针变量p,表示指针变量不能被改变
	//       但是指针的内容,可以被改变;
	*p = 20;
	p = &n;//报错
	printf("%d",num);
	return 0;
}

3.模拟实现strlen

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
int my_strlen(const char* str)
{
	assert(str != NULL);
	int count = 0;
	while (*str != '\\0')
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	char arr[] = "bit";
	int len = my_strlen(arr);
	printf("%d\\n", len);
	return 0;
}

以上是关于[C语言]模拟实现strcpy的主要内容,如果未能解决你的问题,请参考以下文章

c语言 strcpy,strcat,strcmp函数模拟实现

C语言——模拟实现库函数(strcat,strcmp,strcpy,srelen)

通过模拟strcpy函数学习编程思想

C语言———字符与字符串

C语言进阶字符函数和字符串函数

C语言初阶笔记程序员必须要会的实用调试技巧(含库函数strcpy和strlen的模拟实现)!!