C语言初阶习题【25】strcpy的模拟实现
1. 首先先调用下库函数,看它实现了什么
2. 我们自己实现一个strcpy函数
3. 改进1
把*destnation++和source++
写上去,使用后置++
4. 改进2
这里直接把赋值操作放到了while的判断条件里面,然后while循环语句什么都不做,放了一个空语句(就是一个;)
判断流程是这样的
进入我们的函数之后,直接开始while语句
(1)执行while条件语言,直接将 * source的值赋值给 * destnation 只要这句语句不等于0就一直循环
(2)后置++ 然后一个一个把goodnight的值赋值过去,
(3)最后到‘\0’、相当于*destnation=‘\0’ 就是等于0,此时表达式为假
(4)所以while(表达式为假) 跳出循环 ,并且我们的’\0’也拷贝过去了 。
#define _CRT_SECURE_NO_WARNINGS 1
//模拟实现strlen 函数#include<stdio.h>
#include<string.h>
void my_strcpy(char *destnation,char* source)
{while (*destnation++ = *source++){;}}
int main()
{char str1[10] = { 0 };char str2[] = "goodnight";my_strcpy(str1, str2);printf("%s", str1);return 0;
}
调试,可以在局部变量看,也可以在内存窗口看str1的变化。
5.改进3
加入assert
#include <assert.h>void my_strcpy(char* dest, char* src)
{/*if (src == NULL || dest == NULL){return;}*///断言//assert中可以放一个表达式,表达式的结果如果为假,就报错,如果为真啥事都不发生//assert 其实在release版本中优化了/*assert(src != NULL);assert(dest != NULL);*/assert(dest && src);while (*dest++ = *src++){;}
}void my_strcpy(char* dest, char* src)
{assert(dest && src);//断言指针的有效性while (*dest++ = *src++){;}
}