模拟实现strcpy等

strcpy的模拟实现

在这里插入图片描述
在这里插入图片描述

//dest指向目标空间
//src指向源字符串
void my_strcpy(char* dest, const char* src)
{
	int i = 0;
	while (src[i] != '\0')
	{
		dest[i] = src[i];
		i++;
	}
	dest[i] = '\0';
}

void my_strcpy1(char* dest, const char* src)
{
	while (*src != '\0')
	{
	//虽然++的优先级高于*,但后置++,先使用后++
		*dest++ = *src++;
		//src把\0之前的字符都拷贝给dest
	}
	//把\0单独拷贝
	*dest = *src;
}

最巧妙的方法

char* my_strcpy3(char* dest, const char* src)
{ 
     assert(src != NULL && dest != NULL);//断言,防止野指针
     char* ret=dest;//用来返回被修改字符串的起始地址

//1.拷贝字符  2.遇到\0循环停止
	while (*dest++ = *src++)
	//*dest++ = *src++表达式的结果
	//就是拷贝过去字符的结果,把'a'拷贝完,结果就是字符a,a的ASCII的值不为0,循环继续
	//把\0拷贝完,\0的ASCII值是0,循环停止
	{
		;//空语句
	}
	return ret;
}

注意:strcpy的使用
1.源头字符串中必须包含\0
2.目标空间要足够大
3.目标空间必须可修改,比如常量字符串,常量字符串放在常量区,是不能被修改的
注意char* str=''abcde'';的意思是把常量字符串首字符a的地址存放在str中
在这里插入图片描述

const注意事项

在这里插入图片描述

被const修饰的变量叫做常变量,它是不能直接被修改的
但有个方法就能让它跳过语法检查,从而被修改,那就是指针

int main()
{
	const int num = 10;//num是常变量
	//num=10 //erro
	int* p = #
	*p = 20;
	printf("%d\n", num);
}

const修饰指针

  1. const放在*的 左边,限制的是*p(也就是指针指向的内容,下面指针指向的内容是num),没有限制p
    在这里插入图片描述

  2. const放在*的右边,限制的p,并没有限制*p
    在这里插入图片描述

  3. *的左右两边都有const
    在这里插入图片描述

总结

const放在*的左边,修饰的是指针指向的内容(p),指针指向的内容,不能通过指针来改变(*p=什么,错),但是指针变量本身是可以改变的
const放在
的右边,修饰的是指针变量本身,指针指向的内容可以修改,但是指针变量本身(p)不能被修改

模拟实现strlen

//size_t 就是unsigned int
size_t my_strlen(const char* str)
{
	assert(str != NULL);
	int i = 0;
	while (*str)
	{
		i++;
		str++;
	}
	return i;
}

库函数里的strlen()的返回值是size_t(无符号整型),因为它不可能算出负数
思考下面这个问题,屏幕上到底是打印呵呵还是哈哈?

int main()
{
	if (strlen("abc") - strlen("abcdef") > 0)
	{
		printf("haha\n");
	}
	else
	{
		printf("hehe\n");
	}
	return 0;
}

答:haha
在这里插入图片描述
所以无符号数-无符号数还是正数

函数栈帧

函数栈帧
ebp,esp这两个寄存器中存放的是地址,这两个地址用来维护函数栈帧的
因为每一个函数调用,都要在栈区创建空间
在这里插入图片描述
在vs2013中,main函数也是被其他函数调用的
在这里插入图片描述

数组指针

在这里插入图片描述

数组中奇数放前

//1, 2, 3, 4, 5, 6, 7, 8, 9
//奇数放前,偶数放后
void move(int* arr, int sz)
{
	int left = 0, right = sz - 1;
	while (left < right)
	{
		//往后找偶数
		while (left < right && arr[left] % 2 == 1)//%2为1就是奇数,还要往后找
		{
			left++;
		}
		while (left < right && arr[right] % 2 == 0)//left<right是大前提
		{
			right--;
		}
		if (left < right)
		{
			int tmp = arr[left];
			arr[left] = arr[right];
			arr[right] = tmp;
		}
	}
}

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9 };
	int sz = sizeof(arr) / sizeof(int);
	move(arr, sz);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ",arr[i]);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值