1.实现strcpy
查阅msdn知道strcpy的函数声明形式如下
char *strcpy( char *strDestination, const char *strSource )
基本用法如下
将字符数组arr2(源操作数)中的字符复制到arr1(目的操作数)中。
void my_strcpy(char* dest, char* ser)
{
//字符串复制
while (*dest++ = *ser++)
{
;
}
}
int main()
{
char arr1[20] = "***********";
char arr2[] = "student";
my_strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
while (*dest++ = *ser++)
·1:后置++的表达式,先使用变量,后对变量进行自增。
2:直接在while循环中进行赋值,因为每一个字符串在定义时,系统会默认加上一个‘\0’(字符串结束标志)而'\0'的ascll码值是0,所以当这个赋值操作进行到‘\0’时,*dest先被赋值为\0,然后while循环判断结果,因其结果为0,所以判断为假跳出循环。而前面的字符串的ascll码值都不为0,那就都判断为真,循环继续。
当然我们也要防止函数传参时传了一个空指针。所以在复制前可以加上assert函数(断言函数)
如果传参时传过来的参数为NULL,那么系统会报错,编译不能通过。
再来比较msdn中定义的标准形式 char *strcpy( char *strDestination, const char *strSource )
在源操作数前有一个const关键字,修饰常变量,被他修饰后,变量中的数据不能通过const修饰过的变量名进行改变(但可以通过指针来改变变量中的数据)这里用来防止字符串赋值时,源操作数和目的操作数写反(会导致结果不能达到预期)
现在 唯一不同的就是函数的返回类型,msdn中strcpy函数返回类型是char * 一个指向字符类型的指针(就是源操作数的首地址)
printf("%s\n", my_strcpy(arr1, arr2));//函数的链式访问,
一个函数的返回值,作为另一个函数的一个操作数。
所以要进行链式访问,那么该函数必须要有返回值。(函数的返回类型不能为void)
下面就是my_strcpy函数的完整实现:
char* my_strcpy(char* dest,const char* ser)
{
//字符串复制
assert(*dest != NULL);//断言
//用法和if相同,不满足就会报错
assert(*ser != NULL);
char* ch = dest;
while (*dest++ = *ser++)
{
;
}
return ch;
}
int main()
{
char arr1[20] = "***********";
char arr2[] = "student";
printf("%s\n", my_strcpy(arr1, arr2));//函数的链式访问
return 0;
}