模拟实现库函数strcpy
要求:把字符串src(源空间)复制到分配好的字符串空间dest(目标空间)中。
1:最简单基础代码
void my_strcpy(char *dest, char *src)
{
while(*src != '\0')
{
*dest = *src;
src++;
dest++;
}
*dest = '\0';
}
int main ()
{
char arr [10]; //空间足够大,即大于等于7
char *p = "abcdef"; //以 '\0' 结束
my_strcpy(arr,p);
printf ("%s\n",arr);
return 0;
}
(以下代码红色部分为优化部分)
2:优化代码如下:
void my_strcpy(char *dest, char *src)
{
while(*src != '\0')
{
*dest++ = *src++;
}
*dest = '\0';
}
int main ()
{
char arr [10];
char *p = "abcdef";
my_strcpy(arr,p);
printf ("%s\n",arr);
return 0;
}
3:更加优化的代码如下:
void my_strcpy(char *dest, char *src)
{
while((*dest++ == *src++) != 0) //先解引用再++
{
;
}
*dest = '\0';
}
int main ()
{
char arr [10];
char *p = "abcdef";
my_strcpy(arr,p);
printf ("%s\n",arr);
return 0;
}
注:
1:目标空间是可改的:
2:目标空间足够大,至少和源空间等大;
3:源空间必须有 ‘\0’ 结束,否则程序运行结果会崩溃。
eg:
char p [] = {'a','b','c','d','e','f'}; //没有 '\0' 结束,所以不能作为源空间
char *p = "a b c d e f"; // 有 '\0' 结束,可以作为源空间
4:考虑到指针变量不能为空,所以模拟实现库函数strcpy的代码还可以继续优化
如下:
void my_strcpy(char *dest, char *src)
{
if(dest == NULL)
{
return;
}
if(src == NULL)
{
return;
}
while((*dest++ == *src++) != 0) //先解引用再++
{
;
}
*dest = '\0';
}
int main ()
{
char arr [10];
char *p = "abcdef";
my_strcpy(arr,p);
printf ("%s\n",arr);
return 0;
}
5:如果使用assert(断言) 代码还可以优化
void my_strcpy(char *dest, char *src)
{
assert(src != NULL); //断言
assert(dest != NULL);
while((*dest++ = *src++)!= '\0')
{
;
}
}
int main ()
{
char arr [10];
char *p = "abcdef";
my_strcpy(arr,p);
printf ("%s\n",arr);
return 0;
}
注: assert (断言)是一个宏
6:*src 不能被改变,考虑到代码的严谨性,还可以用 const 来继续优化
void my_strcpy(char *dest, const char *src) //不能改变*src的值
{
assert(src != NULL);
assert(dest != NULL);
while((*dest++ = *src++)!= '\0')
{
;
}
}
int main ()
{
char arr [10];
char *p = "abcdef";
my_strcpy(arr,p);
printf ("%s\n",arr);
return 0;
}
7:如果应用链式访问,代码还可以继续优化
char* my_strcpy(char *dest, const char *src)
{
char *ret = dest;
assert(src != NULL);
assert(dest != NULL);
while((*dest++ = *src++)!= '\0')
{
;
}
return ret;
}
int main ()
{
char arr [10];
const char *p = "abcdef";
//char *ret = my_strcpy(arr,p);
printf ("%s\n",my_strcpy);
return 0;
}