目录
1、模拟strcpy函数
模拟函数不是实现函数,这是有区别的!模拟函数要完全符合这个函数的定义,而实现函数只需要实现这个函数最后表现出来的功能即可。以下是代码实现:
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* src)
{
assert(dest && src);//断言
char* ret = dest;
while (*src != '\0')
{
*dest = *src;
dest++;
src++;
}
return ret;
}
int main()
{
char arr1[10] = { 0 };
char arr2[] = "hello";
printf("%s\n", my_strcpy(arr1, arr2));
return 0;
}
1.1 assert()函数
如果dest和src指针传参时为空指针(NULL),程序不能显示出结果,这就需要程序员去对代码进行调试。assert的作用是当指针为空时,能及时报错,省去调试的时间。
此时是模拟函数中传进了空指针时被assert函数截断:
1.2 const用法
作用一:const修饰变量
作用二:const修饰指针
1.2.1作用一:const修饰变量
当变量n在定义时加上const,那么之后再对n进行修改会报错。通俗地说就是n从变量变成了常量,常量不能修改。
#include<stdio.h>
int main()
{
const int n = 0;
n = 20;
printf("%d\n",n);
return 0;
}
1.2.2作用二:const修饰指针
此情况会相对复杂!
修饰在*前:表示修饰指针指向的内容,指针指向的内容不得被修改。但指针变量本身是可 以被改变的。
修饰在*后: 表示修饰指针变量本身,指针变量指向的内容不得被修改,但指针指向的内容 可以被修改。
修饰在*前:
#include<stdio.h>
int main()
{
int n = 10;
int m = 20;
const int* p = &n;
*p = m;//错误,指针指向的内容不得被改变
p = &m;//正确,指针变量指向的内容可以改变
printf("%d\n", n);
return 0;
}
修饰在*后:
#include<stdio.h>
int main()
{
int n = 10;
int m = 20;
int* const p = &n;
*p = m;//正确,指针指向的内容可以被修改
p = &m;//错误,指针变量指向的内容不得被修改
printf("%d\n", n);
return 0;
}
1.3代码优化
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* src)
{
assert(dest && src);//断言
char* ret = dest;
//
while (*dest++ = *src++)//此语句直接实现了判断、赋值和自增
{
;
}
//
return ret;
}
int main()
{
char arr1[10] = { 0 };
char arr2[] = "hello";
printf("%s\n", my_strcpy(arr1, arr2));
return 0;
}