C语言模拟实现库函数 strlen strcpy

通过学习VS调试debug,了解到一名优秀的程序员是一名优秀的侦探

程序员写代码在debug版本,也称用户版本,调试版本

release版本是发布版本,不能调试,也是测试人员使用的版本 也是优化之后的版本 

我们观看这个代码 此代码属于栈溢出错误

#include <stdio.h>
int main()
{
	int i = 0;
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	for (i = 0; i <= 12; i++)
   {
		printf("hello \n");
       arr[i] = 0;
	}
	return 0;
}

在vs2019中 通过监视我们可以发现

由于局部变量放在内存中的栈区,栈区的使用习惯是由低地址向高地址使用

随着数组下标的增长,地址由低到高变化

在vs2019 i和arr之间2个整型  i <= 12

在vc6.0  i和arr之间无空间  i <= 10

在gcc  i和arr之间1个整型  i <= 11

下面是模拟实现strlen 代码如下

//实现打印字符串
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* arr)//返回类型是size_t 与原库函数返回类型一样
//conust 表示对*str进行限制
{
	assert(*arr!= NULL); //断言 如果为假则提醒程序将报错 如果为真,则无影响  
	size_t count = 0;
	while (*arr++ != '\0')
	{
		count++;
	}
	return  count;
}
int main()
{
	char* arr = "abcdeft";
    printf("%d", my_strlen(arr));//链式访问
	return 0;
}

运行结果如下

 

下面是模拟实现strcpy函数

//实现库函数strcpy函数  对字符串拷贝
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* source)//起初的变量放在 最后
{
	assert(dest && source);
		//	//assert中可以放一个表达式,表达式的结果如果为假,就报错,如果为真啥事都不发生
		//	//assert 其实在release版本中优化了
	char* ret = dest;
	while (*dest++ = *source++)
		;
	return ret;
}
int main()
{
	char arr1[80] = {0};
	char* p = "hello";
	printf("%s\n", my_strcpy(arr1, p));//把p放在arr1中  源头 终点
	return 0;
}

注意常见的错误:编译型错误 链接型错误 运行时错误 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值